Skip to content

Commit

Permalink
Enrich task1 description and guidance
Browse files Browse the repository at this point in the history
  • Loading branch information
Gemini321 committed Feb 27, 2024
1 parent ad1dea8 commit b9b5025
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
Binary file added docs/images/task1pack.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 14 additions & 2 deletions docs/task1_doc/flex.md
Original file line number Diff line number Diff line change
Expand Up @@ -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代码介绍

Expand Down
13 changes: 12 additions & 1 deletion docs/task1_doc/overview.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Task1 总体介绍

## 实验内容

本次实验的实验内容是实现一个简单的词法分析器。下面通过一个简单但直观的例子向大家介绍本次实验的主要内容。

文件`build/test/task0/basic/000_main.sysu.c`中的代码如下所示:
Expand All @@ -17,7 +20,7 @@ int main(){

```

上面这段代码已经是`clang`预处理后的结果。在同学们完成完成实验零之后,将上面这段代码输入到同学们实现的词法分析器之后,会得到如下内容(词法分析的结果):
上面这段代码是`clang`预处理后的结果。在同学们完成完成实验零之后,将上面这段代码输入到同学们实现的词法分析器,会得到如下内容(词法分析的结果,与`clang`的词法分析结果相同):

```c++
int 'int' [StartOfLine] Loc=<./basic/000_main.sysu.c:1:1>
Expand All @@ -36,10 +39,18 @@ 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)

完成源代码预处理后,同学们可以自由编写`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)

0 comments on commit b9b5025

Please sign in to comment.