1.文法

SysY 语言的文法采用扩展的 Backus 范式(EBNF,Extended Backus-Naur Form)表示,其中:

  • 符号[…]表示方括号内包含的为可选项
  • 符号{…}表示花括号内包含的为可重复 0 次或多次的项
  • 终结符或者是由单引号括起的串,或者是 Ident、InstConst 这样的记号

SysY 语言的文法表示如下,其中CompUnit为开始符号:

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
编译单元 CompUnit → {Decl} {FuncDef} MainFuncDef

声明 Decl → ConstDecl | VarDecl

常量声明 ConstDecl → 'const' BType ConstDef { ',' ConstDef } ';'

基本类型 BType → 'int'

常数定义 ConstDef → Ident { '[' ConstExp ']' } '=' ConstInitVal

常量初值 ConstInitVal → ConstExp
| '{' [ ConstInitVal { ',' ConstInitVal } ] '}'

变量声明 VarDecl → BType VarDef { ',' VarDef } ';'

变量定义 VarDef → Ident { '[' ConstExp ']' }
| Ident { '[' ConstExp ']' } '=' InitVal

变量初值 InitVal → Exp | '{' [ InitVal { ',' InitVal } ] '}'

函数定义 FuncDef → FuncType Ident '(' [FuncFParams] ')' Block

主函数定义 MainFuncDef → 'int' 'main' '(' ')' Block

函数类型 FuncType → 'void' | 'int'

函数形参表 FuncFParams → FuncFParam { ',' FuncFParam }

函数形参 FuncFParam → BType Ident ['[' ']' { '[' ConstExp ']' }]

语句块 Block → '{' { BlockItem } '}'

语句块项 BlockItem → Decl | Stmt

语句 Stmt → LVal '=' Exp ';'
| [Exp] ';'
| Block
| 'if' '(' Cond ')' Stmt [ 'else' Stmt ]
| 'for' '(' [ForStmt] ';' [Cond] ';' [forStmt] ')' Stmt
| 'break' ';' | 'continue' ';'
| 'return' [Exp] ';'
| LVal '=' 'getint''('')'';'
| 'printf''('FormatString{','Exp}')'';'

语句 ForStmt → LVal '=' Exp

表达式 Exp → AddExp 注:表达式是int型表达式

条件表达式 Cond → LOrExp

左值表达式 LVal → Ident {'[' Exp ']'}

基本表达式 PrimaryExp → '(' Exp ')' | LVal | Number

数值 Number → IntConst

一元表达式 UnaryExp → PrimaryExp | Ident '(' [FuncRParams] ')'
| UnaryOp UnaryExp

单目运算符 UnaryOp → '+' | '−' | '!' 注:'!'仅出现在条件表达式中

函数实参表 FuncRParams → Exp { ',' Exp }

乘除模表达式 MulExp → UnaryExp | MulExp ('*' | '/' | '%') UnaryExp

加减表达式 AddExp → MulExp | AddExp ('+' | '−') MulExp

关系表达式 RelExp → AddExp | RelExp ('<' | '>' | '<=' | '>=') AddExp

相等性表达式 EqExp → RelExp | EqExp ('==' | '!=') RelExp

逻辑与表达式 LAndExp → EqExp | LAndExp '&&' EqExp

逻辑或表达式 LOrExp → LAndExp | LOrExp '||' LAndExp

常量表达式 ConstExp → AddExp 注:使用的Ident 必须是常量

2.终结符特征

(1)标识符Ident

SysY 语言中标识符 Ident 的规范如下 ( identifier ) :

1
2
3
identifier → identifier-nondigit
| identifier identifier-nondigit
| identifier digit

其中,identifier-nondigit为下划线或大小写字母,digit为0到9的数字。

(2)注释

SysY 语言中注释的规范与 C 语言一致,如下:

  • 单行注释:以序列 ‘//’ 开始,直到换行符结束,不包括换行符。
  • 多行注释:以序列 ‘/’ 开始,直到第一次出现 ‘/’ 时结束,包括结束处‘*/’。

(3)数值常量

SysY 语言中数值常量可以是整型数 IntConst,其规范如下(对应 integer- const):

1
2
3
整型常量 integer-const → decimal-const | 0
decimal-const → nonzero-digit | decimal-const digit
nonzero-digit 为1至9的数字