【编译】实验1-文法解读

blog的md格式渲染有误,您可以考虑通过下载来使用:md格式下载(直接md下载不了,于是搞成了压缩包) pdf格式下载

编译单元 compUnit → {Decl} {FuncDef} MainFuncDef

1 常量 & 变量

声明 Decl → ConstDecl | VarDecl

1.1 常量

常量声明 constDecl → 'const' BType constDef { ',' constDef } ';'

基本类型 BType → 'int'

常量定义 constDef → Ident [ '[' constExp ']' ] '=' constInitval

常量初值 constInitval → constExp | '{' [ constExp {',' constExp } ] '}'

1.2 变量

变量声明 varDec1 → [ 'static' ] BType varDef { ',' varDef } ';'

变量定义 varDef → Ident [ '[' constExp ']' ] | Ident [ '[' constExp ']' ] '=' Initval

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

2 函数

2.1 函数

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

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

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

函数形参表 FunCFParams → FunCFParam { ',' FunCFParam }

函数形参 FuncFParam → BType Ident [ '[' ']' ]

2.2 语句

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

语句块项 BlockItem → Decl | Stmt

语句 Stmt → LVal '=' Exp ';'

| [Exp] ';'

| Block

| 'if' '(' Cond ')' Stmt [ 'else' Stmt ]

| 'for' '(' [ForStmt] ';' [Cond] ';' [ForStmt] ')' Stmt 8种缺省组合(其中一种需要ForStmt有多个定义)

| 'break' ';'

| 'continue' ';'

| 'return' [Exp] ';'

| 'printf' '(' StringConst { ',' Exp } ')' ';'

语句 ForStmt → LVal '=' Exp { ',' LVal '=' Exp }

2.3 表达式

表达式 Exp → AddExp

条件表达式 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
解释:常量表达式是一个能在编译时计算出确定值的加法表达式(AddExp),其中所有标识符都必须是常量。

3 我犯过的错

语句写的越简单越不容易犯错!!! 1. for()里面不能定义变量:如 for(int i=0; ; ) 2. 不可以 i++ 3. 不可以 a && (b):如 if(0 && (g+=1))


【编译】实验1-文法解读
http://example.com/2025/09/22/LE-bianyiS1/
Author
John Doe
Posted on
September 22, 2025
Licensed under