-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbnf.txt
More file actions
121 lines (100 loc) · 5.13 KB
/
bnf.txt
File metadata and controls
121 lines (100 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// 程序由语句构成,虽然显得多余,但:
// a.后续扩展性更强,在更复杂的语法中,清晰体现程序的结构(例如后续可能添加全局声明、包声明等)。
// b.允许`<statement-list>`在其他上下文中复用(比如函数体内的语句序列)。
<program> ::= <statement-list>
// 语句列表通过递归定义,支持任意数量的语句。
// 一个语句(`<statement>`)后跟另一个语句序列(`<statement-list>`),形成递归链。
// 空序列(`ε`),作为递归终止条件。
<statement-list> ::= <statement> <statement-list> | ε
// 语句类型
<statement> ::= <var-declaration> // 变量声明语句
| <assignment> // 变量赋值语句
| <field-assignment> // 类字段赋值语句
| <function-definition> // 函数定义语句
| <class-definition> // 类结构定义语句
| <if-statement> // 条件语句
| <loop-statement> // 循环语句
| <return-statement> // 返回语句
| <expression> ";" // 表达式语句:以分号结尾的表达式,通常用于计算或调用函数。
// 变量声明,使用关键字var,类型可选
<var-declaration> ::= "var" <identifier> [ "=" <expression> ] ";"
// 标识符必须以字母开头
<identifier> ::= <letter> ( <letter> | <digit> | "_" )*
// 字母包括所有大小写字母
<letter> ::= "a" | "b" | ... | "z" | "A" | "B" | ... | "Z"
// 数字包括从 0 到 9
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
// 赋值语句
<assignment> ::= <identifier> "=" <expression> ";"
// 字段赋值语句(支持链式字段赋值,如 obj.field.subfield = value)
<field-assignment> ::= <member-access> "=" <expression> ";"
// 成员访问(用于字段赋值左侧,支持链式访问)
<member-access> ::= <identifier> ( "." <identifier> )*
// 表达式语句
// 逻辑运算表达式(优先级最低在最前)
<expression> ::= <logical-or>
<logical-or> ::= <logical-and> ( "||" <logical-or> )?
<logical-and> ::= <equality> ( "&&" <logical-and> )?
<equality> ::= <comparison> ( ("==" | "!=") <comparison> )*
<comparison> ::= <add-sub> ( ("<" | ">" | "<=" | ">=") <add-sub> )*
<add-sub> ::= <mul-div> ( ("+" | "-") <mul-div> )*
<mul-div> ::= <factor> ( ("*" | "/" | "%") <mul-div> )*
// 表达式解析的最底层,是优先级最高的基本单元。它定义了表达式可以开始的所有基本形式。
<factor> ::= <literal>
| <identifier>
| <unary-expression>
| "(" <expression> ")"
| <function-call>
| <class-instantiation>
| <field-access>
| <method-call>
| <this-expression>
// 一元表达式
<unary-expression> ::= ("-" | "!") <factor>
// 字段访问(支持链式访问,如 obj.field.subfield)
<field-access> ::= <identifier> ( "." <identifier> )+
// 方法调用(支持链式调用,如 obj.method().anotherMethod())
<method-call> ::= <identifier> ( "." <identifier> )* "." <identifier> "(" [ <argument-list> ] ")"
// this表达式(在方法内部引用当前实例)
<this-expression> ::= "this"
// 字面量
<literal> ::= <number> | <boolean> | <string>
// 数字
<number> ::= <integer> | <float>
// 整数
<integer> ::= <digit>+
// 小数,小数点后至少一位数字
<float> ::= <digit>+ "." <digit>+
// 布尔值
<boolean> ::= "true" | "false"
// 字符串
<string> ::= '"' (<string-content>)* '"'
<string-content> ::= <letter> | <digit> | <escape-sequence>
// 转义字符
<escape-sequence> ::= "\\" | "\"" | "\n" | "\t"
// 函数调用
<function-call> ::= <identifier> "(" [ <argument-list> ] ")"
// 参数列表
<argument-list> ::= <expression> ( "," <expression> )*
// 条件语句
<if-statement> ::= "if" <expression> "{" <statement-list> "}" [ "else" "{" <statement-list> "}" ]
// 循环
<loop-statement> ::= "for" <expression> "{" <statement-list> "}"
// 返回语句,return 后面可以跟表达式(返回值),也可以不跟(隐式返回 null 或 void)。所以用 [ <expression> ] 表示可选。
<return-statement> ::= "return" [ <expression> ] ";"
// 函数定义
<function-definition> ::= "fun" <identifier> "(" <parameter-list> ")" "{" <statement-list> "}"
// 函数参数列表
<parameter-list> ::= <identifier> ("," <identifier>)* | ε
// 复合类型定义
<class-definition> ::= "class" <identifier> "{" <class-member-list> "}"
// 复合类型成员列表(包含字段和方法)
<class-member-list> ::= <class-member> <class-member-list> | ε
// 复合类型成员(字段或方法,方法复用函数定义语法)
<class-member> ::= <field-decl> | <function-definition>
// 复合类型字段定义
<field-decl> ::= "var" <identifier> [ "=" <expression> ] ";"
// 复合类型构创建
<class-instantiation> ::= <identifier> "(" [ <field-initializer-list> ] ")"
<field-initializer-list> ::= <field-initializer> ( "," <field-initializer> )*
<field-initializer> ::= <identifier> "=" <expression>