3 Star 3 Fork 0

wangbyby / compiler

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

项目说明

2020年,大三下学习编译原理所写实验lalr分析器

  • parser目录: c++下flex与bison实现的语法分析器,输出AST. 打印格式不好看
  • tac目录: c++下flex与bison实现的部分三地址代码生成器,输出三地址代码
  • rust_lalr目录: rust写的玩具lalr分析器, 有bug.

体会

  • 初始设计很重要, 比如说这次实验, 我们把block作为expression, 导致if文法的冗余. 但木已成舟, 不好调头.
  • 用OOP方法实现AST很自然流畅, 但C++中某些内存错误就不好debug, 比如说else_stmt->debug(), 如果else_stmt未定义, 那么直接抛出core dumped, 没有其他一点报错. 很不友好
  • c++的debug不友好
  • rust很香

思考题

1.词法分析能否采用空格来区分单词? 不可,比如a=10; 但对于int a;又需要空格来划分. 即单纯用空格划分不靠谱, 需要与单词类别结合综合判断. 2.程序设计中哪些环节影响词法分析的效率?如何提高效率? 用flex好像真没遇到效率问题. 3.生成的三地址代码可否直接输出(不采用数据结构来实现属性code)? 没有定义code字段, 而是输出到一个全局vector中 4.如何保证四则运算的优先关系和左结合性? 在bison中定义即可, 自动工具会用了很厉害 5.如何采用代码段相对地址代替三地址代码序列中的标号? 全局vector 6.完成一个实验,通常要进行实验设计、实验实现、实验结果分析,你在本次实验中,是否都涉及的这三个类工作,在大学学习的这几年的实验中,是不是都或多或少设计了这三类工作?

  • 实验设计:

    1. 使用OOP来生成AST
    2. 使用全局vector存储三地址码
  • 实现

    • 生成三地址码, 参考了龙书中的回填技术
    • 全局vector从设计上来说不好, 但好用
  • 实验结果分析

    • 三地址码生成的label其实是全局vector中的下标, 所以说没有严格从0开始.
    • 生成冗余的label, 是因为回填的冗余
    • 临时变量用%开头, 而不是t, 因为t_可能是一个正式的变量名
    • 三地址码中的变量定义, 比如说x:int, 有些小小的奇怪😂
    • 在三地址码生成时会自动把八进制,十六进制转换为十进制(整数和浮点数)
    • if if else的二义性解决, 通过改写文法实现的. 改写为if C {...} else ..., 限定了if的作用域, 挺多语言都这样子.
    • while语句也改写了, 接近于c语言风格
  • 之前的设计只是小打小闹, 在学过软工后才明白设计的重要性以及设计的手段

    • 明确需求很难
    • 写代码反而简单
    • 有了框架之后就是搭积木, 除非积木不兼容框架

环境说明

  1. 平台: wsl, 可视为(Ubuntu 7.4.0-1ubuntu1~18.04.1)
  2. 工具:
bywww@wbypc:~/projects/helloworld/flex_bison/compiler/tac$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' 
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 

bywww@wbypc:~/projects/helloworld/flex_bison/compiler/tac$ make -v
GNU Make 4.1
Built for x86_64-pc-linux-gnu
  1. flexbison
bywww@wbypc:~$ flex --version
flex 2.6.0
bywww@wbypc:~$ bison --version
bison++ Version 1.21.9-1, adapted from GNU bison by coetmeur@icdc.fr
Maintained by Magnus Ekdahl <magnus@debian.org>

rust_lalr

  • 直到...不变的代码需要改,当下用loop+长度判断实现, 希望有更好的判断方法
    • 难点是, 闭包在计算过程中不断生成. 双栈+accessed不行, 因为accessed长度在变化

空文件

简介

大三编译原理作业 展开 收起
C++
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/bybywww/compiler.git
git@gitee.com:bybywww/compiler.git
bybywww
compiler
compiler
master

搜索帮助