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的数字
|