MENU

编译原理实验 语义分析和中间代码生成

December 12, 2020 • Read: 2109 • 默认分类

编译原理短语,直接短语,句柄,素短语:
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文件、符号表文件的基础上,完善语法和词法分析,产生相应的中间代码-四元式序列。

img

在图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

<字符串> -> ”{<字符>|<数字>}”

<加减法运算> -> +|-

<乘除法运算> -> *|/

<关系运算符> -> <|<=|>|>=|!=|= =

四元式的参考操作码

后端所产生的四元式的参考操作代码及其解释如下:

操作码Op1Op2Result
+XYX和Y相加
-XYX和Y相减
*XYX和Y相乘
/XYX和Y相除
= YY 赋值
<XYX小于Y
>XYX大于Y
!=XYX不等于Y
<=XYX小于等于Y
>=XYX大于等于Y
==XYX等于Y
JMP 跳转到result所指标签
RED 从终端输入一个值放到result
WRIX 将X输出到终端

项目代码结构:

Microsoft Visual Studio Community 2019 下测试通过。

image-20201212153102766

运行结果图:

image-20201212153339082

完整项目代码

Last Modified: January 22, 2021
Archives QR Code Tip
QR Code for this page
Tipping QR Code