北理BIT 2024 编译原理 Lab. 2 二代编译器实验

本文介绍了北理BIT2024编译原理课程中Lab.2的实验,涉及词法分析的实现,包括使用flex工具和C语言类型的定义。还讨论了后续的语义处理、代码结构、输入文件处理以及计算部分,特别是中缀表达式转后缀表达式的注意事项。
摘要由CSDN通过智能技术生成

北理BIT 2024 编译原理 Lab. 2 二代编译器实验

题目要求

见文档,大致来说就是在词法分析的基础上进行简单的语义处理,并生成汇编代码

代码结构

为避免查重,此处仅给出部分关键代码架构

词法分析

可以选择手动实现或者采用flex词法分析器实现,博主采用的是flex词法分析器实现,以下为flex的部分代码
DIGIT [0-9]
LETTER [a-zA-Z]
UNDERLINE [_]
VARIABLE_NAME ({LETTER}|{UNDERLINE})({LETTER}|{DIGIT}|{UNDERLINE})*
WHITESPACE [ \t\n]
ws {WHITESPACE}+
INTERGER ({DIGIT}+)

上述定义了C语言常见的一些类型
下面对可能出现的字符进行完备的定义

需要特别注意:

空格和缩进都是可以不识别并直接略过的
“,”是非常容易忽略的一个字符(e09如果查不出错看看是不是“,”没处理)

其余就没有太多可以分析的了大致分以下几类:属性随便设个不是0的int就行,因为

int yylex()可以视为读入下一个词

类型属性
变量和VAR
关键字(不含main)KEYWORD
括号BRACKET
分号LINE
等号(赋值)EQUAL
双目算符OPERATER

传递逻辑

博主使用的sstream实现,维护一个公有的字符流,每次词法识别就向流中输入识别到的单词,返回该单词的属性,主函数在另一个文件通过这个流进行读取。

eg:

stream<<yytext;
    return(OPERATER);

调用

主函数通过include编译出来的cpp文件,读取输入的文件名,将file*指向该文件(同lab1)

yyin=file*将文件内容传递给词法分析器,通过yylex()读取词法分析结果

我的方法是存成类或者结构,会方便一些

计算

计算其实没有太多可以说的,因为和lab1大差不差,需要注意几个小问题

  1. print和return都是可以以常数为值或者变量的,如果是用字符串存的值,要注意-a或者–a的bug
  2. 对关键词的识别要严格判断,不能用包含识别,同时“main”不是KEYWORD
  3. 在算中缀转后缀的时候要考虑最后栈形如-,3的情况,单独讨论
  4. 一点小技巧:可以维护变量的堆栈,当出现算式时,利用变量表直接将变量表达式替换为常量表达式

祝愿大家顺利

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值