我有这个基本的JFlex lexer:
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 = [^rn]
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文件都应该有一个final。打印一个'非法字符' 错误消息(不是抛出的异常),或者只是将yytext[0]
返回给解析器供解析器处理。
后一种策略还使您不必为每个特殊字符(例如=、+等)编写规则:解析器应该只将它们用作'='
、'+'
等。然后(a)任何非法字符都将成为语法错误,但更重要的是(b)解析器将使用其错误恢复,而不仅仅是丢弃标记。
您要么没有显示所有语法,要么语法不完整。
Exception in thread "main" java.lang.Error: Illegal character <l>
这个消息告诉你不处理loop
关键字