update report
This commit is contained in:
parent
402f26b01d
commit
613f041c72
34
CS143体验报告.md
34
CS143体验报告.md
@ -38,10 +38,16 @@
|
||||
PA 2-5 正式写编译器。PA2 写词法分析器,首先读一遍 README 和 handout。
|
||||
|
||||
> 环境配置
|
||||
>
|
||||
> 因为这个项目的结构非常的智障,导致需要进行一些配置才能让 `clangd` 正常工作。因为是 `Makefile` 项目,所以不能直接生成 `compile_commands.json`。
|
||||
> 1. 安装 `apt install bear`,这个工具可以拦截 `make` 命令来生成上述的文件。
|
||||
> 2. 在 PA2 目录下,运行 `make clean && bear -- make lexer`,然后 `clangd` 应该就不会找不到头文件之类的了
|
||||
|
||||
> 获取评测脚本
|
||||
>
|
||||
> 现在已经没有办法在线提交测试了(除非花钱?),因此需要从一些奇怪的地方获取测试工具,这里我从 https://github.com/shootfirst/CS143 这个 repo 里面扒了评测脚本(测试数据已经包含在了脚本里了) `pa[2-5]-grading.pl`,测试的话直接用 `perl ./pa2-grading.pl` 就行了。
|
||||
> 这个东西确实测出来一些自己没考虑到的边角问题,虽然我已经很努力的在编测例了。
|
||||
|
||||
写完了发现还是很折磨的,写了快两天的样子,一方面是对于 `flex` 工具和配套的基础设施不是很了解,另一方面是各种细节问题需要处理。
|
||||
|
||||
#### 实现说明
|
||||
@ -71,6 +77,8 @@ PA 2-5 正式写编译器。PA2 写词法分析器,首先读一遍 README 和
|
||||
|
||||
不过其实,最离谱的是自己设计测试样例,这很考验对于手册的理解,不然就会漏掉点什么(虽然漏掉一些 edge case 对于后面也没啥影响就是了)。
|
||||
|
||||
在用了官方的评测脚本之后,又发现了一个问题:`\\0`(`0x5C 0x00`) 是不允许的。这个其实判定起来不难,但是会想不到,因为 PA2 的 handout 没写这一条,虽然 manual 里面 `A string may not contain the null` 的确是不允许这种情况(因为它转义完了还是 `\0`),但是谁会想到测这个呢?
|
||||
|
||||
#### 基础设施说明
|
||||
|
||||
个人感觉,一开始做的比较迷惑的主要原因在于它的代码框架比较凌乱,文档也有点谜语人,读了好几遍文档才知道该写点啥。
|
||||
@ -93,3 +101,29 @@ PA 2-5 正式写编译器。PA2 写词法分析器,首先读一遍 README 和
|
||||
- **VSCode 插件**:搜到两个还算下载量比较多的,但是都不行,有一个着色有 bug(可能是因为它太老了,接口不兼容了),还有一个加了莫名其妙的、极具误导性的语法检查还关不掉(一点问题都没有的代码给我每行一个红色波浪线)。建议用第二个,然后大脑忽略他的错误提示。
|
||||
|
||||
剩下的就看两眼文档就会了,跟课上教的 Regular Expression 基本上大差不差。
|
||||
|
||||
### PA3
|
||||
|
||||
这个作业写 Parser。主要问题依然来自于 bison 工具不会用以及各种奇形怪状的 edge case,折磨程度和前一个差不多,写了3天的样子。写的时候一直在想如果有 `ANTLR` 就好了,之前玩过,感觉比 Flex+Bison 这种老古董要舒服多了。
|
||||
|
||||
#### Bison 踩坑
|
||||
|
||||
前期主要是 Bison 不会用,这里记录一些坑。基本上的工作就是在翻译手册上的 BNF 然后写 semantic action。写着写着突然发现它的课上好像根本没讲这玩意,就挺抽象的。
|
||||
|
||||
1. 关于 Bison 手册的阅读:这里我直接用的最新的3.8.2,直接看最新的文档就行了。
|
||||
1. 1.1-1.4,简单了解一下;第2章可以看,也可以去看看《Flex与Bison》,都是用例子讲解;然后就是具体的东西,3.2-3.4,3.7,5.1-5.7这些都会用到;看看这些基本上就能把框架搭起来了。
|
||||
2. 然后到了第一次编译,第8章关于 debug 的说明还是可以看看的
|
||||
3. 最后是看第6章关于错误处理的说明,虽然这个说明也没啥大用。
|
||||
2. 框架代码会导致 Shift-Reduce Conflict:如果是框架提供的那种、用空规则定义各种 `xx_list` 的写法,会出现 SR Conflict。虽然实际上应该是可以用的(大雾)(因为有一些 bison 的默认行为会使得这么做能够得到正常的结果),但是我还是把它拆掉了(不像看到 warning),也就是把用到 `xx_list` 的地方写成有 `xx_list` 和无 `xx_list` 两种,而不是交给 `xx_list` 这个 `nterm` 来处理空的情况。这样就没有 warning 了。
|
||||
3. 一些东西是 bison 的扩展,因为开了兼容性警告 `-Wyacc`,所以用了会 warning,比如 `%empty` `%precedence` 这种。
|
||||
|
||||
剩下的倒是没啥,因为没有用旧版本的东西,所以没有出现 `flex` 那么多奇怪的东西。
|
||||
|
||||
#### 基础设施说明
|
||||
|
||||
这里的代码库主要是他们自己写的奇怪的 AST 的东西,
|
||||
|
||||
|
||||
#### 实现说明
|
||||
|
||||
要修改的文件主要是 `cool.y`,但是为了处理行号的问题,还需要修改 `/include/PA3/cool-parse.h:754`。参考的代码为 `cool-tree.aps` 以及从它生成的 `cool-tree.cc`,主要是看一些函数的定义。
|
||||
Loading…
Reference in New Issue
Block a user