编译原理短语,直接短语,句柄,素短语:
https://blog.csdn.net/starter_____/article/details/88601595
语义分析中间代码生成:
源程序为标准C的一个子集,其语法特征如下:
1) 基本数据类型BasicType: int
2) 变量声明: BasicType avariable;
3) 函数定义: BasicType foo(BasicType param1, BasicType param2,...)
4) 四则运算: +,-,/,*
5) 赋值: =
6) 返回: return, return BasicTypeValue
7) 逻辑判断: if, else (含复合语句)
8) 循环: while(含复合语句)
9) 复合语句块标记: { }
在由词法分析程序分析SimpleC产生的token文件、符号表文件的基础上,完善语法和词法分析,产生相应的中间代码-四元式序列。
在图1-1中,整个编译程序结构以语法分析组件为中心,在语法分析组件对句子结构生成或归约的控制下,其调用词法分析组件从输入的源程序字符流中识别单词,完成语法树的逐步构造,其间词法分析程序、语法分析程序将对符号表进行操纵。在语法树构造完成后,调用语义分析对语法树进行静态语义分析,当通过静态语义分析(即表明源程序无静态语义错误)后,调用代码生成组件完成中间代码(四元式)的生成。出错检查和处理程序服务于词法分析、语法分析和代码生成组件。
参考EBNF文法如下:
<程序> -> <主函数><子函数><变量说明>
<主函数> -> (void|int)main<参数><复合语句>
<子函数> -> (<声明头部>|void<标识符>)<参数><复合语句>
<参数> -> ’(’<参数表>’)’
<参数表> -> <表达式>{,<表达式>|<空>}
<复合语句> -> ’{’<常量说明><变量说明><语句列>’}’
<变量定义> -> int<标识符>=<整数>{,<标识符>=<整数>}
<变量说明> -> <声明头部>{,<标识符>}
<声明头部> -> int<标识符>
<语句序列> -> <语句>{<语句>}
<语句> -> <条件语句>|<循环语句>|<’{’<语句序列>’}’|
<子函数调用语句>;|<赋值语句>;|<返回语句>;|
<读语句>;|<写语句>;|<空>
<赋值语句> -> <标识符>=<表达式>
<条件语句> -> if’(’<条件>’)’<语句>|
else’(’<条件>’)’<语句>
<循环语句> -> while<条件><语句>
<读语句> -> scanf’(’<标识符>’)’
<写语句> -> printf’(’<标识符>’)’
<返回语句> -> return ’(’<表达式>’)’
<子函数调用语句> -> (<声明头部>|void<标识符>)<参数>
<表达式> ->{+|-}<项>{<加法运算><项>}
<项> -> <因子>{<乘除法运算><因子>}
<因子> -> <标识符>|’(’<表达式>’)’|<整数>|<子函数调用语句>
<标识符> -> <字符>{<字符>|<数字>}
<字符> -> a|b|………..|z
<数字> -> 0|<非零数字>
<非零数字> -> 1|2|3|4|5|6|7|8|9
<字符串> -> ”{<字符>|<数字>}”
<加减法运算> -> +|-
<乘除法运算> -> *|/
<关系运算符> -> <|<=|>|>=|!=|= =
四元式的参考操作码
后端所产生的四元式的参考操作代码及其解释如下:
操作码 | Op1 | Op2 | Result |
---|---|---|---|
+ | X | Y | X和Y相加 |
- | X | Y | X和Y相减 |
* | X | Y | X和Y相乘 |
/ | X | Y | X和Y相除 |
= | Y | Y 赋值 | |
< | X | Y | X小于Y |
> | X | Y | X大于Y |
!= | X | Y | X不等于Y |
<= | X | Y | X小于等于Y |
>= | X | Y | X大于等于Y |
== | X | Y | X等于Y |
JMP | 跳转到result所指标签 | ||
RED | 从终端输入一个值放到result | ||
WRI | X | 将X输出到终端 |
项目代码结构:
Microsoft Visual Studio Community 2019 下测试通过。
运行结果图: