2013-01-11 63 views
0

我有這個基本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

+0

你從你自己的代碼中拋出異常,你不知道它是什麼意思? – EJP

+0

如果我不扔它,我會得到另一種類型的錯誤。我目前沒有相應的代碼,但如果我沒有記錯的話,我得到了「無法匹配輸入」錯誤。 – pAndrei

+0

您似乎已將lexing與一些解析邏輯組合在一起。詞庫需要相對簡單,只需標識令牌,並將繁重的工作留給解析器。你看起來很複雜。 –

回答

1

所以你有一個角色出現在你的輸入中,你不知道如何處理。

所有lex文件應該有最終的。規則要麼打印「非法字符」錯誤消息(不是拋出的異常),否則只是返回yytext[0]到解析器供解析器處理。

後一種策略還可以避免您必須爲每個特殊字符編寫規則,例如=,+等等:解析器應該將它們用作'=','+'等。然後(a)任何非法字符只是成爲語法錯誤,但更重要的是(b)解析器可以使用它的錯誤恢復,而不是僅僅丟棄該令牌。

+0

請您詳細說明一下嗎?你是否建議我將導致語法錯誤的規則重寫爲將yytext [0]返回給解析器的規則?謝謝! – pAndrei

+0

@pAndrei我建議你用我提到的其中一種替代品替換它。 – EJP

0

您要麼不顯示所有語法,要麼語法不完整。

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

此消息表明您不處理loop關鍵字。

+0

不是。這意味着沒有規則匹配傳入的'l'。您可能能夠從完整的語法和輸入文件中推斷出您所說的內容,但不是它本身意味着什麼。 – EJP

+0

我接受了EJP的答案,因爲雖然它不是確切的解決方案(代碼明智),但我有想法添加規則:。 {}在我的文件底部。這解決了我的錯誤:) – pAndrei

+0

@pAndrei你似乎有upvoted它,不接受它。 – EJP