运行 JFlex 生成的词法分析器时出现 Java 错误

标签 java debugging parsing compiler-construction jflex

我有这个基本的 JFlex 词法分析器:

import java.util.*;
%%

%public
%class TuringLexer
%type Void

%init{
yybegin(YYINITIAL);
%init}

%state COMM, GETALPH, MT, PARSELOOP, PARSELEMS, PARSESYMB, PARSEMT
%{
  ArrayList<Character> alf = new ArrayList<Character>();   
  String crtMach;
  String crtLoop;
  String crtLoopContent;
  String crtLoopContentParam;
  String crtContent;
  String crtSymb;
%}

//Input = [^\r\n]
SEP = [:space:]*
//COMM =[;.*$] 
name = [A-Za-z_]*
tok=[A-Za-z0-9#$@\*]
AL = "alphabet :: "
cont = [^]]*
param =[^)]*
letter = [A-Za-z]
opn = [\[?]
symb = [^\}]+
%%
 <COMM> {
  "."  { /* ignore */  System.out.println("Got into comm state ");}
  "\n" {System.out.println("Got out of comm state ");yybegin(YYINITIAL);}
}
 <GETALPH> {
 {SEP} { /* ignore */ }
 {tok} { String str = yytext();
     System.out.println("Alphabet -- " + str);
     Character c = str.charAt(0);
     alf.add(c); }
 ";"  {yybegin(YYINITIAL);}

}
 <YYINITIAL> {
 "\n"   { /* ignore */ System.out.println("Got into YYINITIAL"); }
 ";"  { yybegin(COMM); }

[^]                    { throw new Error("Illegal character <"+yytext()+">"); }
}

为了清楚起见,代码已被删除,但问题仍然存在,因此在这里更容易识别它。

这是输入文件 -> 文件名为 simple.mt

这是主类:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.FileReader;
public class MainClass  {
public static void main(String args[]) throws IOException {
    Reader reader = new BufferedReader(new FileReader ("simple.mt"));
    reader.read();
    TuringLexer tl = new TuringLexer(reader);
    tl.yylex();
}
}

当我在 eclipse (或终端,就此而言)中运行项目时,我得到:

Exception in thread "main" java.lang.Error: Illegal character <l>
    at TuringLexer.yylex(TuringLexer.java:576)
    at MainClass.main(MainClass.java:11)

我不知道错误意味着什么以及如何调试它,jflex 文件中剩下的只是一个小样本,因此错误应该不难弄清楚

最佳答案

因此,您的输入中出现了一个您不知道如何处理的字符。

所有 lex 文件都应该有一个最终的 .规则要么打印“非法字符”错误消息(不是抛出的异常),要么只是将yytext[0]返回给解析器供解析器处理。

后一种策略还使您不必为每个特殊字符(例如 =、+ 等)编写规则:解析器应该仅将它们用作 '=' '+' 等。然后 (a) 任何非法字符都会变成语法错误,但更重要的是 (b) 解析器可以使用其错误恢复,而不是仅仅丢弃标记。

关于运行 JFlex 生成的词法分析器时出现 Java 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287636/

相关文章:

c# - 在异常抛出时停止时查看异常

windows - 如何让调试器强制 Windows 线程从 sleep 状态唤醒?

c++ - 在 opt 中编译时指向对象的空指针,但在 debug 中则不然

linux - 在linux、bash中的单独列中回显2个变量

java - ScrollView 落后于 Android 中的按钮

java - 如何在 @Configuration 类中 Autowiring Spring 注释的服务类?

java - Android 开发中的协程仅适用于 Kotlin?使用 MVVM 从 android room 检索,如何让 id 立即返回到 Activity?

c# - .NET (C#) 的 JSSE 等价物是什么?

javascript - 是否可以阻止浏览器解析某些元素?

c++ - 将二进制文件拆分为 block c++