跳到主要内容

语法基础

OSC2 采用缩进风格(类似 Python),通过缩进组织代码块。文件以 .osc 为扩展名。

注释

使用 # 表示单行注释:

# 这是一个注释
scenario my_scenario:
# 缩进内的注释
do serial:
car.drive()

文件结构

一个 OSC2 文件由导入声明和顶层定义组成:

# 导入(可选)
import osc.standard

# 顶层定义:类型、枚举、结构体、角色、场景等
type my_type is ...
scenario my_scenario:
...

导入

使用 import 语句引用其他文件:

import "path/to/file.osc" # 文件路径导入
import osc.standard # 标准库导入

关键字

OSC2 的保留关键字包括:

scenario actor action struct type enum do serial parallel one_of event keep extend inherits def import with is it var global cover call wait on until emit if default fall rise elapsed every sample hard only remove_default undefined as in and or not range list of record external SI unit bool int uint float string

标识符

标识符区分大小写,支持 Unicode 字符。如需包含空格,使用管道符包裹:

my_variable: int
|my variable|: string

场景结构

场景使用 scenario 关键字声明,通过 do 定义行为:

scenario my_scenario:
ego: vehicle
do serial:
ego.drive(duration: 10s)

行为组合

  • serial — 顺序执行(上一个结束后下一个开始)
  • parallel — 并行执行(同时开始)
  • one_of — 选择执行(随机选择一个分支)
do serial:
phase1: parallel(duration: 5s):
car1.drive()
car2.drive()
phase2: serial:
car1.drive(speed: 30kph)
car2.drive(speed: 50kph)

修饰器

使用 with 为行为添加参数和限制:

car.drive() with:
speed(60kph)
lane(1)
keep(speed < 80kph)

字面量

42 # 整数
3.14159 # 浮点数
true # 布尔值
"hello" # 字符串
10m # 物理量(10米)
50kph # 物理量(50公里/小时)
[1..10] # 范围

完整示例

import osc.standard

scenario highway_drive:
ego: vehicle
do serial:
approach: parallel(duration: 10s):
ego.drive with:
speed(60kph)
lane(1)
cruise: parallel(duration: 30s):
ego.drive with:
speed(80kph)
lane(1)