谭子悦 201250093

思路

本次实验的目标为:使用 ANTLRv4 编写一个 SysY 的词法分析器。

主要实现过程分为如下几步:

  1. SysYLexer.g4 文件中编写相应的词法规则
  2. 通过 ANTLR 根据此法规则生成 SysYLexer.java
  3. 利用 Lexer API 和 ANTLR Runtime API 编写应用,分析识别结果并输出信息

实现细节

Let the Lexer stop on error

实验要求:若 Lexer 在分析过程中发现错误,则仅输出全部错误而不输出正确内容,因此主程序需要通过某种途径的得知 Lexer 出现了分析错误,并在所有错误输出后中止分析。

为了实现这一要求,暴力让 Listener 一旦识别到错误就退出是肯定不可以的,因此我在 Listener 内添加了 field errorHappened 与相应的 getter hasErrorHappened(),使 Listener 一旦监听到错误便将该 boolean value 设置为 true,随后主程序在调用 sysYLexer.getTokens() 后立刻检查 hasErrorHappened(),若是,则立刻退出程序。

 // Get tokens
 var tokens = sysYLexer.getAllTokens();
 // Error exit
 if (myErrorListener.hasErrorHappened()) {
   return;
 }