From 613f041c72ab9a468a5ff46bdde13098aa36b9b5 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Thu, 23 Mar 2023 20:00:47 +0800 Subject: [PATCH] update report --- CS143体验报告.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/CS143体验报告.md b/CS143体验报告.md index 7957f1b..bf4560f 100644 --- a/CS143体验报告.md +++ b/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`,主要是看一些函数的定义。 \ No newline at end of file