【问题标题】:Java error when running JFlex generated lexer运行 JFlex 生成的词法分析器时出现 Java 错误
【发布时间】:2013-01-11 22:21:26
【问题描述】:

我有这个基本的 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 文件中剩下的只是一个小样本,所以错误应该不难弄清楚

【问题讨论】:

  • 您是从自己的代码中抛出该异常,但您不知道这意味着什么?
  • 如果我不抛出它,我会得到另一种类型的错误。目前我手头没有相应的代码,但如果我没记错的话,我会收到“无法匹配输入”错误。
  • 您似乎已将词法分析与您的一些解析逻辑结合起来。词法分析器需要相对简单,只识别标记,并将繁重的工作留给解析器。你所拥有的看起来很复杂。

标签: java debugging parsing compiler-construction jflex


【解决方案1】:

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

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

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

【讨论】:

  • 您能详细说明一下吗?您是否建议我将导致语法错误的规则替换为将 yytext[0] 返回给解析器的规则?谢谢!
  • @pAndrei 我建议你用我提到的替代方案之一替换它。
【解决方案2】:

您要么没有显示所有语法,要么语法不完整。

Exception in thread "main" java.lang.Error: Illegal character <l>

此消息表明您不处理 loop 关键字。

【讨论】:

  • 并非如此。这意味着没有与传入的“l”匹配的规则。您可能能够从完整的语法和输入文件中推断出您所说的内容,但这并不是仅此消息的含义。
  • 我接受了 EJP 的回答,因为虽然它不是确切的解决方案(代码方面),但我想到了添加规则 : 。 { } 在我的文件底部。这解决了我的错误:)
  • 哦,对不起,我已经接受了。我再次为这个问题道歉,谢谢你帮助我。也感谢您指出!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2010-09-15
  • 2019-10-18
  • 1970-01-01
  • 2013-11-13
  • 2022-12-14
相关资源
最近更新 更多