[educoder实训]编译课程实验-词法分析- VNC 界面[待完善]

本实训项目围绕关系运算符及其他符号的单词识别,开展三种词法分析器的构造,包括手工构造的词法分析器以及分别利用 Flex、ANTLR 词法分析器生成工具产生词法分析器源码。你需要结合实训,体会并比较这些方法的异同。

  • 手工编写一个识别关系运算符的词法分析器
  • 用 Flex 构造识别关系运算符的词法分析器
  • 用 ANTLR 构造识别关系运算符的词法分析器

第1关:手工编写一个识别关系运算符的词法分析器

任务描述

本关任务:编写一个词法分析程序,它能对输入的一行字符流进行词法分析,依次识别出其中的关系运算符和其他符号,并输出对应的记号序列。例如,若输入的字符流为:

if (a<=b) a=b

则输出:

(other,5)(relop,<=)(other,4)(relop,=)(other,1)

这里(other,5)表示一个非关系运算符的子串,其中可能含有空格等空白符。识别关系运算符的转换图如下图11所示:
图1
图 1

相关知识

为了完成本关任务,你需要掌握如何使用在线实训图形化界面。

在线实训图形化界面

在线实训图形化界面提供一个虚拟桌面供你实验,虚拟桌面右部有版本库和测试集两个标签,上部和下部各有一排命令按钮图标。虚拟桌面的右下方有测评按钮,点击该按钮,在线实训平台将执行本实训项目预置的脚本进行自动评测。过程如下:

  • 点击桌面的workspace文件夹图标,即可进入实训项目的工作目录,它位于/data目录下。workspace/XXX/YYY目录下面即存放实训项目在本桌面虚拟环境下的本地版本库;
  • 你可以点击桌面上的命令按钮来打开文件管理器进行虚拟环境的文件管理;
  • 你可以点击桌面上的命令按钮 来打开终端进行命令行操作;
  • 点击版本库标签,将在桌面右部展开出现本实训项目的版本库的网址,如https://git.educoder.net/XXX/YYY.git,以及版本库的树形目录结构;
  • 你可以在虚拟桌面的终端或者你本地的终端执行git clone https://git.educoder.net/XXX/YYY.git拉取版本库。如果你git clone到本地,你可以在本地开展实验,再用git push提交;
  • 你可以点击树形目录结构中的节点来查看相关内容。如果你点击的是文件,则桌面会进一步打开编辑器并将该文件加载到该编辑器,你可以在编辑器中修改文件内容。
  • 在版本库里面的修改无需使用git提交即可进行评测;
  • 在修改完之后需使用git进行提交(git push),以免环境被销毁后导致所做修改消失;
  • 第一次git push前,需先使用git pull --unshallow命令从远程库拉取完整内容到虚拟桌面环境,因为平台缺省地只拉取了最近一次的提交。

编程要求

请仔细阅读相关知识,掌握在线实训图形化界面并完成词法分析程序的编写任务。请按如下目录结构来组织本关卡的提交文件,目录结构如下:

<your repo>
  |-- labLexer
>>  |-- src/     # 增加你编写的词法分析器源码
>>  |-- test/     # 增加你的测试例子
>>  |-- doc/     # 增加文档描述实验中遇到的问题、分析和设计,文件名前缀为labLexer-1
>>  |-- CMakeLists-1.txt     # 写的CMakeLists-1.txt
    |-- 其他文件     # README、shell脚本等

注意:你需要把你在本关卡使用的CMakeLists.txt改名为CMakeLists-1.txt进行提交,以避免和本实训项目其他关卡的文件相冲突。cmake命令默认是从当前目录找CMakeLists.txt来进行执行。

助教会借助脚本来实现对实训项目的半自动检查,会将你所上传的CMakeLists-1.txt复制为CMakeLists.txt来进行编译并检查。因此,你实训环境中的CMakeLists.txt在评测后可能会被更改。请一定严格按照本节要求组织实训项目的目录和文件,否则会影响本次实验成绩。

注意事项:

  • 换行符标识字符流结束;
  • 输出为$$1$$行,中间不包含任何空格符,末尾不用输出换行符;
  • 请特别注意行尾的处理,正确地处理CRLFLF两种换行符;
  • 生成的目标可执行程序名为labLexer-1

测试说明

平台会对你的代码进行运行测试。

第2关:用 Flex 构造识别关系运算符的词法分析器

任务描述

本关任务:

  1. 熟悉本实训项目版本库中flex-examples子目录下提供的表达式语言的词法分析例子,查看词法规范文件expr.lexMakefile,阅读README并按其中的提示进行词法分析器的构造和运行;
  2. 针对第$$1$$关的关系运算符的识别需求,用Flex自动生成相应的词法分析器源码并编译和测试。

注意:需要利用宏LEXERGEN来选择是用手工编写的词法分析函数,还是由Flex生成的词法分析函数。

相关知识

为了完成本关任务,你需要掌握:

  1. Flex的输入词法规范文件的格式;
  2. 如何用Flex为所给定的词法规范文件构造词法分析器并使用。

请阅读 Flex manual 和本实训项目提供的简单的表达式语言的词法分析例子(位于版本库的flex-examples子目录下),了解Flex的输入词法规范文件的格式。

编程要求

请仔细阅读相关知识,使用Flex完成自动生成相应的词法分析器。请按如下目录结构来组织本关卡的提交文件,目录结构如下:

<your repo>
  |-- labLexer
>>  |-- grammar/     # 增加你编写的词法规范描述文件
>>  |-- src/      # 增加你编写的词法分析器源码
>>  |-- test/      # 增加你的测试例子
>>  |-- doc/     # 增加文档描述实验中遇到的问题、分析和设计,文件名前缀为labLexer-2
>>  |-- Makefile     # 增加你编写的Makefile文件
    |-- 其他文件     # README、shell脚本等

注意事项

  • 本关输入输出与关卡$$1$$一致;
  • 编写词法规范描述文件relop.lex并存入提交目录labLexer下的 grammar子目录;
  • 参照flex-examples子目录下的expr.c,编写labLexer-2.c。其中包含main函数,它在宏LEXERGEN定义时调用Flex生成的词法分析函数,在该宏未定义时调用你在第$$1$$关手工编写的词法分析函数;
  • 本关使用make进行编译,你可以参照flex-examples子目录下的Makefile,编写Makefile来进行编译和测试。

注意:使用Flex生成的词法分析函数对应的目标可执行程序名为labLexer-2,而使用第11关手工编写的词法分析函数对应的目标可执行程序名需要命名为labLexer-2m(该Makefile在使用make命令时应该生成这两个可执行程序)。

测试说明

平台会对你的代码进行运行测试。

第3关:用 ANTLR 构造识别关系运算符的词法分析器

任务描述

本关任务:

  1. 熟悉本实训项目版本库中antlr4-examples子目录下提供的词法分析例子,查看词法规范文件labLexer.g4、主程序文件main.cppCMakeLists.txt,阅读README.md并按其中的提示进行词法分析器的构造和运行;
  2. 针对第$$1$$关的关系运算符的识别需求,用antlr4自动生成相应的词法分析器源码并编译和测试。

相关知识

为了完成本关任务,你需要掌握:

  1. antlr4的输入词法规范文件的格式,参照antlr4-examples中的g4文件以及 Lexer Rules
  2. 学习使用antlr4所给定的词法规范文件构造词法分析器并使用之:
    • 参考官方的 demo
    • 参考antlr4-examples
    • 参考编译过程中生成的文件。
  3. ANTLR v4 具备独立测试语法文件及将分析图和分析结果可视化的功能。为可视化分析图,推荐使用Visual Studio Code作为编辑器,安装 ANTLR 插件。在一个.g4文件的编辑窗口中右键,你会看到几个选项,点击即可。

为测试语法文件并可视化分析结果,你首先需要按照Environment页面中的要求配置好 ANTLR v4 的工作环境。在此前提下,按如下步骤完成测试(在src/grammar目录中):

# Compile grammar to Java source codeantlr4 *.g4# Compile Java source codejavac *.java# Testing lexer, testfile is the file you create# Lexer is the name of g4 filegrun Lexer tokens -tokens testfile
本地实验的环境配置方法

平台已配置好所需的各种软件,antlr-4.7.2-complete.jar/usr/local/lib目录下。

1. Java 环境安装 ANTLR 工具需要 JVM 才能执行,此外为了方便使用 ANTLR 的grun,你需要一个能够编译 java 源文件的环境。因此,你需要一个完整的Java Development Kit

  • 如果你使用 Linux,推荐通过包管理器安装 OpenJDK 8。在你的包管理器中通过搜索来确定包名,如 Ubuntu,下包名为openjdk-8-jdk, 安装即可;
  • 如果你使用 Mac,你需要手动安装一个 JDK。

2. ANTLR 下载与安装

  • 你需要从 ANTLR Download 下载antlr-4.7.2-complete.jar
  • 你需要将该jar包的存放路径加入到环境变量CLASSPATH中,即可以 Bash中执行export CLASSPATH=".:/path/to/your/antlr-4.7.2-complete.jar:$CLASSPATH"
  • 你可以考虑将这一命令加入.bashrc(对于Bash),以省去你每次配置的麻烦。

3. 定义antlr4grun工具

  • 可以定义别名antlr4表示ANTLR工具,即alias antlr4='java org.antlr.v4.Tool'
  • grun 本质上是一个别名,可以定义如下:alias grun='java org.antlr.v4.runtime.misc.TestRig'alias grun='java org.antlr.v4.gui.TestRig'
  • 同样的,你可以将这些别名命令加入到.bashrc,以节省你配置和使用的时间。

编程要求

请仔细阅读相关知识,使用antlr4完成自动生成相应的词法分析器。请按如下目录结构来组织本关卡的提交文件,目录结构如下:

<your repo>
  |-- labLexer
>>  |-- grammar/     # 增加你编写的词法规范描述文件
>>  |-- src/     # 增加你编写的词法分析器源码
>>  |-- test/     # 增加你的测试例子
>>  |-- doc/     # 增加文档描述实验中遇到的问题、分析和设计,文件名前缀为labLexer-3
>>  |-- CMakeLists-3.txt     # 增加你编写的CMakeLists.txt文件
    |-- 其他文件      # README、shell脚本等

注意:你需要把你在本关卡使用的CMakeLists.txt改名为CMakeLists-3.txt进行提交,以避免和本实训项目其他关卡的文件相冲突。cmake命令默认是从当前目录找CMakeLists.txt来进行执行。

助教会借助脚本来实现对实训项目的半自动检查,会将你所上传的CMakeLists-3.txt复制为CMakeLists.txt来进行编译并检查。因此,你实训环境中的CMakeLists.txt在评测后可能会被更改。请一定严格按照本节要求组织实训项目的目录和文件,否则会影响本次实验成绩。

注意事项

  • 在开展本关实验前,请完整编译运行antlr4-examples子目录下的例子。请阅读该子目录下的README.md来了解编译和运行过程,你需要进一步理解该子目录下各个文件以及生成的文件之间的关系,理解整个编译构建过程;注:README.md里面的cmake命令-D后面少了ANTLR_EXECUTABLE,完整应该是cmake .. -DANTLR_EXECUTABLE=/full/path/to/antlr-4.7.2-complete.jar
  • 编写词法规范描述文件relop.g4并存入提交目录labLexer下的 grammar子目录 (此步骤可独立完成,并依据相关知识来判断正确性);
  • 参照antlr4-examples子目录下的main.cpp,编写labLexer-3.cpp,输入输出与前两关是一样的;
  • 编写CMakeLists.txt以及测试脚本,生成的最终可执行程序为labLexer-3,注意其中不需定义ANTLR_EXECUTABLE,评测脚本会进行定义;
  • 在链接antlr4运行时动态库时,使用平台系统已安装的antlr4-runtime,不要使用自己编译生成的或者antlr4-examples子目录下提供的libantlr4-runtime.so.4.7.2,以防评测脚本出现错误;注:使用命令target_link_libraries(XXX antlr4-runtime)
  • 你可以复用antlr4-examples子目录下提供的FindANTLR.cmake

测试说明

平台会对你的代码进行运行测试。

© 版权声明
THE END
喜欢就支持以下吧
点赞0赞赏
分享
评论 抢沙发

请登录后发表评论