diff --git a/docs/images/task1pack.png b/docs/images/task1pack.png new file mode 100644 index 0000000..8960c2d Binary files /dev/null and b/docs/images/task1pack.png differ diff --git a/docs/task1_doc/flex.md b/docs/task1_doc/flex.md index 2f9a095..9be083c 100644 --- a/docs/task1_doc/flex.md +++ b/docs/task1_doc/flex.md @@ -55,11 +55,23 @@ IS ((u|U)|(u|U)?(l|L|ll|LL)|(l|L|ll|LL)(u|U)) "_Bool" { ADDCOL(); COME(BOOL); } ``` -上面代码中的,`auto`是一个词法单元,`COME(AUTO)`中的`AUTO`是我们在前面提到过的`lex.hpp`中的`enum Id`中被定义的枚举值。但`AUTO`并非我们在最终文件中输出的字符串,最终文件中`AUTO`对应输出的字符串需要到`lex.cpp`文件的`kTokenNames`数组的**对应位置**进行修改。 +上面代码中的`auto`是一个词法单元,`COME(AUTO)`中的`AUTO`是我们在前面提到过的`lex.hpp`中的`enum Id`中被定义的枚举值。但`AUTO`并非我们在最终文件中输出的字符串,最终文件中`AUTO`对应输出的字符串需要到`lex.cpp`文件的`kTokenNames`数组的**对应位置**进行修改。 -所以最终进行总结,同学们的任务即是在`lex.l`中编写词法分析规则之后,到`enum Id`中去添加对应的枚举值,并且在`kTokenNames`的正确位置添加对应的输出字符串即可。 +所以最终进行总结,同学们的任务是在`lex.l`中编写词法分析规则后,到`enum Id`中添加对应的枚举值,并且在`kTokenNames`的正确位置添加对应的输出字符串。除了正确识别出每个词法单元的类型并输出外,我们还需要识别出词法单元出现在源文件中的位置和源文件路径,这要求我们在处理对应文本时记录与更新当前词法单元状态。相关状态保存在`lex.cpp`的全局结构体变量`G g`中。 +```c++ +struct G +{ + Id mId{ YYEOF }; // 词号 + std::string_view mText; // 对应文本 + std::string mFile; // 文件路径 + int mLine{ 1 }, mColumn{ 1 }; // 行号、列号 + bool mStartOfLine{ true }; // 是否是行首 + bool mLeadingSpace{ false }; // 是否有前导空格 +}; +``` +正确记录词法单元状态后,状态将通过`main.cpp`的`void print_token()`函数进行输出。 ## main.cpp代码介绍 diff --git a/docs/task1_doc/overview.md b/docs/task1_doc/overview.md index a1cb931..889c038 100644 --- a/docs/task1_doc/overview.md +++ b/docs/task1_doc/overview.md @@ -1,4 +1,7 @@ # Task1 总体介绍 + +## 实验内容 + 本次实验的实验内容是实现一个简单的词法分析器。下面通过一个简单但直观的例子向大家介绍本次实验的主要内容。 文件`build/test/task0/basic/000_main.sysu.c`中的代码如下所示: @@ -17,7 +20,7 @@ int main(){ ``` -上面这段代码已经是`clang`预处理后的结果。在同学们完成完成实验零之后,将上面这段代码输入到同学们实现的词法分析器之后,会得到如下内容(词法分析的结果): +上面这段代码是`clang`预处理后的结果。在同学们完成完成实验零之后,将上面这段代码输入到同学们实现的词法分析器,会得到如下内容(词法分析的结果,与`clang`的词法分析结果相同): ```c++ int 'int' [StartOfLine] Loc=<./basic/000_main.sysu.c:1:1> @@ -36,6 +39,8 @@ eof '' Loc=<./basic/000_main.sysu.c:3:2> 同学们可能会想,实现这样的一个词法分析器的工程量应该很大吧?设计实验以及编写文档的助教和大家的想法是一样的!所以肯定不会让大家从零开始实现一个词法分析器。在`task1`中我们提供了`flex`和`antlr`两种框架来实现我们的词法分析器,其中`antlr`在`task2`中还会继续用到。同学们可以自由选择自己喜欢的框架进行实现。 +## 实验步骤 + 实验开始前,请同学们以task1为构建目标(在`PROJECT STATUS/Build`中选择,见“如何做实验”一节)并进行配置,然后在`PROJECT OUTLINE/SYsU-lang/test/task0`中选择构建`task0-answer`。该操作将自动将所有`SYsU-lang2/test/cases/*/*.sysu.c`源代码进行预处理。预处理结果将保存在`SYsU-lang2/build/test/task0`文件夹中,并作为词法分析器lexer的输入进行词法分析。 ![build task0](../images/task0answer.png) @@ -43,3 +48,9 @@ eof '' Loc=<./basic/000_main.sysu.c:3:2> 完成源代码预处理后,同学们可以自由编写`SYsU-lang2/task/1`中的源代码。完成源代码编写后,可以通过`PROJECT OUTLINE/SYsU-lang/test/task1`中选择构建`task1-score`进行实验一的评分。完成所有样例测评后,每个样例的标准输出、实际输出和评分结果将保存在`SYsU-lang2/build/test/task1`文件夹中,同学们可以根据评分结果对比标准输出和实际输出进行代码修改。 ![score task1](../images/task1score.png) + +为了简化词法分析器,我们仅判断文件结束符`eof`的词法输出结果是否被正确识别并输出别名,而不进行词法单元位置和源文件路径的判断。 + +完成实验代码编写和测试后,请通过构建`PROJECT OUTLINE/SYsU-lang/task/task1-score`进行实验一源代码打包并提交至测评机进行正式测评,打包结果将保存于`/workspaces/SYsU-lang2/build/task`中。 + +![pack task1](../images/task1pack.png)