# SysY_Compiler **Repository Path**: fuoct/SysY_Compiler_2 ## Basic Information - **Project Name**: SysY_Compiler - **Description**: 111111111111111111 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-13 - **Last Updated**: 2024-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SysY 编译器 - 北航 2023 年秋季 ## 介绍 本仓库实现了一个将 SysY (简化 C 语言) 编译为 mips 汇编的编译器, 支持词法分析, 语法分析, 语义分析和中间代码生成, 目标代码生成, 符号表管理和错误处理. 没有进行代码优化. 中间代码为四元式. ## SysY 文法 SysY 文法如下, 其中 `CompUnit` 为开始符号. ```text 编译单元 CompUnit → {Decl} {FuncDef} MainFuncDef // 1.是否存在Decl 2.是否存在FuncDef 声明 Decl → ConstDecl | VarDecl // 覆盖两种声明 常量声明 ConstDecl → 'const' BType ConstDef { ',' ConstDef } ';' // 1.花括号内重复0次 2.花括号内重复多次 基本类型 BType → 'int' // 存在即可 常数定义 ConstDef → Ident { '[' ConstExp ']' } '=' ConstInitVal // 包含普通变量、一维数组、二维数组共三种情况 常量初值 ConstInitVal → ConstExp | '{' [ ConstInitVal { ',' ConstInitVal } ] '}' // 1.常表达式初值 2.一维数组初值 3.二维数组初值 变量声明 VarDecl → BType VarDef { ',' VarDef } ';' // 1.花括号内重复0次 2.花括号内重复多次 变量定义 VarDef → Ident { '[' ConstExp ']' } // 包含普通变量、一维数组、二维数组定义 | Ident { '[' ConstExp ']' } '=' InitVal 变量初值 InitVal → Exp | '{' [ InitVal { ',' InitVal } ] '}'// 1.表达式初值 2.一维数组初值 3.二维数组初值 函数定义 FuncDef → FuncType Ident '(' [FuncFParams] ')' Block // 1.无形参 2.有形参 主函数定义 MainFuncDef → 'int' 'main' '(' ')' Block // 存在main函数 函数类型 FuncType → 'void' | 'int' // 覆盖两种类型的函数 函数形参表 FuncFParams → FuncFParam { ',' FuncFParam } // 1.花括号内重复0次 2.花括号内重复多次 函数形参 FuncFParam → BType Ident ['[' ']' { '[' ConstExp ']' }] // 1.普通变量2.一维数组变量 3.二维数组变量 语句块 Block → '{' { BlockItem } '}' // 1.花括号内重复0次 2.花括号内重复多次 语句块项 BlockItem → Decl | Stmt // 覆盖两种语句块项 语句 Stmt → LVal '=' Exp ';' // 每种类型的语句都要覆盖 | [Exp] ';' //有无Exp两种情况 | Block | 'if' '(' Cond ')' Stmt [ 'else' Stmt ] // 1.有else 2.无else | 'for' '(' [ForStmt] ';' [Cond] ';' [ForStmt] ')' Stmt // 1. 无缺省 2. 缺省第一个ForStmt 3. 缺省Cond 4. 缺省第二个ForStmt | 'break' ';' | 'continue' ';' | 'return' [Exp] ';' // 1.有Exp 2.无Exp | LVal '=' 'getint''('')'';' | 'printf''('FormatString{','Exp}')'';' // 1.有Exp 2.无Exp 语句 ForStmt → LVal '=' Exp // 存在即可 表达式 Exp → AddExp 注:SysY 表达式是int 型表达式 // 存在即可 条件表达式 Cond → LOrExp // 存在即可 左值表达式 LVal → Ident {'[' Exp ']'} //1.普通变量 2.一维数组 3.二维数组 基本表达式 PrimaryExp → '(' Exp ')' | LVal | Number // 三种情况均需覆盖 数值 Number → IntConst // 存在即可 一元表达式 UnaryExp → PrimaryExp | Ident '(' [FuncRParams] ')' // 3种情况均需覆盖,函数调用也需要覆盖FuncRParams的不同情况 | UnaryOp UnaryExp // 存在即可 单目运算符 UnaryOp → '+' | '−' | '!' 注:'!'仅出现在条件表达式中 // 三种均需覆盖 函数实参表 FuncRParams → Exp { ',' Exp } // 1.花括号内重复0次 2.花括号内重复多次 3.Exp需要覆盖数组传参和部分数组传参 乘除模表达式 MulExp → UnaryExp | MulExp ('*' | '/' | '%') UnaryExp // 1.UnaryExp2.* 3./ 4.% 均需覆盖 加减表达式 AddExp → MulExp | AddExp ('+' | '−') MulExp // 1.MulExp 2.+ 需覆盖 3.- 需覆盖 关系表达式 RelExp → AddExp | RelExp ('<' | '>' | '<=' | '>=') AddExp // 1.AddExp 2.< 3.> 4.<= 5.>= 均需覆盖 相等性表达式 EqExp → RelExp | EqExp ('==' | '!=') RelExp // 1.RelExp 2.== 3.!= 均需覆盖 逻辑与表达式 LAndExp → EqExp | LAndExp '&&' EqExp // 1.EqExp 2.&& 均需覆盖 逻辑或表达式 LOrExp → LAndExp | LOrExp '||' LAndExp // 1.LAndExp 2.|| 均需覆盖 常量表达式 ConstExp → AddExp 注:使用的Ident 必须是常量 // 存在即可 ``` ## 输入输出 输入输出均放在工程根目录下. 输入文件: 代码源文件 `testfile.txt` 输出文件: 目标代码 `mips.txt`, 中间代码 `ir.txt`, 符号表信息 `table.txt`, 错误处理信息 `error.txt`.