我有這個基本JFlex的詞法分析器:Java錯誤運行時產生的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#[email protected]\*]
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文件是一個小樣本,因此錯誤不應該是很難想OU t
你從你自己的代碼中拋出異常,你不知道它是什麼意思? – EJP
如果我不扔它,我會得到另一種類型的錯誤。我目前沒有相應的代碼,但如果我沒有記錯的話,我得到了「無法匹配輸入」錯誤。 – pAndrei
您似乎已將lexing與一些解析邏輯組合在一起。詞庫需要相對簡單,只需標識令牌,並將繁重的工作留給解析器。你看起來很複雜。 –