6.0 KiB
形式文法
本附录集中列出正文采用的文法草案。文法说明可表达的源码结构;名称、类型、可见性与执行效果由相应章节定义。各主题的确定程度见规范状态。
EBNF 记法
| 记法 | 含义 |
|---|---|
= |
定义产生式 |
; |
结束产生式 |
| ` | ` |
, |
顺序连接 |
[ ... ] |
可选项 |
{ ... } |
零次或多次重复 |
( ... ) |
产生式分组 |
| 引号中的文本 | 源码终结符 |
产生式中的逗号和分号属于 EBNF 记法,不要求源码在相同位置包含分隔符。任意词法单元之间可出现空白或行注释。EOF 表示输入结束。
程序与导入
program = { use-decl }, declaration, { declaration }, EOF ;
declaration = class-decl | function-decl | agent-decl ;
use-decl = "use", namespace-key ;
namespace-key = workspace-handle, ":", namespace-path ;
namespace-path = identifier, { ".", identifier } ;
workspace-handle 是系统认可的唯一 workspace 名称,由平台命名规则提供,不等同于源码 identifier 或操作用户的登录标识。代码自身的归属通过外部上下文提供,程序文法中没有自身 namespace 声明。
角色和 r/w/x 是平台授权模型,不增加 use 参数、源码权限位或逐函数的权限声明。代码可视域的具体语法另行定义,见用户身份与 workspace 权限。
类与类型
class-decl = "class", identifier, "{", { class-member }, "}" ;
class-member = field-decl | function-decl ;
field-decl = identifier, ":", type-name ;
type-name = identifier ;
相关说明:类型与类。
成员函数沿用 function 声明骨架;接收者、实例关联和类内名称查找未由这条产生式确定。
Agent 声明骨架
agent-decl = "agent", identifier, "{", { agent-member }, "}" ;
agent-member = field-decl | binding | function-decl
| class-decl | agent-decl ;
此骨架是复用共有成员的语法提案,不是完整 agent 文法。工具关联、memory、state、路由、中断和上下文处理的专门关系尚未定义,不将这些职责名自动列为关键字或固定字段。成员中的表达式通过绑定或函数体出现,不能从允许共有成员推导任意语句可出现在任意位置。
agent 和 class 内部的名称查找、可见性、成员初始化及实例关联另行定义。骨架能表达成员函数,但未决定工具暴露范围;binding 仍只说明初始绑定,不决定重新赋值或共享状态。
函数与绑定
function-decl = "function", identifier, "(", [ parameters ], ")",
":", type-name, block ;
parameters = parameter, { ",", parameter } ;
parameter = identifier, ":", type-name ;
block = "{", { binding }, return-stmt, "}" ;
binding = "let", identifier, "=", expression ;
return-stmt = "return", expression ;
本基本函数体文法只包含绑定和末尾返回,不覆盖完整控制流或独立表达式语句。
变量可以改变引用目标的语言模型已经确定,但可变变量声明、重新赋值和 let 可重绑性尚未确定,故不在此添加赋值产生式。
表达式
expression = sum ;
sum = product, { ("+" | "-"), product } ;
product = unary, { ("*" | "/"), unary } ;
unary = "-", unary | postfix ;
postfix = primary, { member-access | call-arguments } ;
member-access = ".", identifier ;
call-arguments = "(", [ expression-list ], ")" ;
expression-list = expression, { ",", expression } ;
primary = identifier | string | number | symbol
| "(", expression, ")" ;
成员访问与调用先于一元负号,一元负号先于乘除,乘除先于加减。正文采用同级二元算术运算从左到右组合的规则。
此处能表达成员调用,不代表某个类型自动拥有相应成员。数据读取提案使用同一套表达式文法,没有单独的 get 关键字。
界面值与资源访问
界面使用普通函数返回可渲染值表达,不增加 scene 声明、render 块或独立节点文法。顶级类型、界面值构造、组件参数及子节点组合的形式尚未定义,因此本附录不补写相应产生式,也不规定单根结构。
客户端访问与呈现是资源处理行为,不增加源码中的函数声明形式。访问定位和函数类型表达的具体写法待定,见规范状态。
词法
identifier = identifier-start, { identifier-continue } ;
identifier-start = "_" | unicode-letter ;
identifier-continue = "_" | unicode-letter | unicode-number ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
number = digit, { digit }, [ ".", digit, { digit } ] ;
symbol = ".", identifier ;
string = '"', { string-character | escape }, '"' ;
escape = "\\n" | "\\t" | '\\"' | "\\\\" ;
line-comment = "//", { character-except-line-feed }, [ line-feed ] ;
unicode-letter、unicode-number、string-character、character-except-line-feed 和 line-feed 为词法字符类别。string-character 不包括未转义的双引号、反斜杠和换行;负号不属于 number。
Unicode 分类边界及源码中的换行字符规则列于规范状态。
相关说明:词法结构。