2012-12-11 31 views
1

我正面臨一個奇怪的ANTLR問題,應該只輸出一個AST。ANTLR找不到定義的起始規則

 grammar ltxt.g; 

options 
{ 
    language=CSharp3; 
} 


prog : start 
    ; 

start  : '{Start 'loopname'}'statement'{Ende 'loopname'}' 
     | statement 
     ; 

loopname : (('a'..'z')|('A'..'Z')|('1'..'9'))*; 
statement : '<%' table_ref '>' 
     | start; 

table_ref : '{'format'}'ID; 

format  : FSTRING 
     | FSTRING OFSTRING{0,5} 
     ; 
FSTRING : '#F' 
    | '#D' 
    | '#U' 
    | '#K' 
    ; 

OFSTRING: 'F' 
    | 'D' 
    | 'U' 
    | 'K' 
    //| 1..65536 
    ; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 


WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

當我嘗試代碼生成這個我得到

  • 錯誤(100):LTXT.g:1:13:語法錯誤:ANTLR:MismatchedTokenException異常(74 = 52!)。我沒有宣佈任何74或52
  • 我也沒有得到一個Synatx圖,因爲「規則‘開始’,」無法找到爲啓動狀態...

我知道,這ISN 「T很漂亮,但我認爲這將至少工作:)

最佳, wishi

回答

1

有四個錯誤,我看到。

  • 語法名稱不能包含句點。這是你得到的語法錯誤。 74!=52錯誤消息是一個提示,告訴你當ANTLR期望令牌ID爲52時,它發現令牌ID爲74,在這種情況下,它僅僅意味着「當它期望別的東西時它發現了一件事情」。
  • 語法名稱(「ltxt」)和擴展名前面的文件名稱(「LTXT」)需要完全匹配。
  • 除非您在options部分指定output=AST;,否則語法不會生成AST。
  • format的第二個選擇(FSTRING OFSTRING{0,5})不會做我認爲你會認爲它會做的事。 ANTLR不支持任意數量的匹配,例如「匹配零至五OFSTRING」。您需要重新定義規則,使用semantic predicates來計算出現的次數。它們並不難用,但它們是ANTLR中比較棘手的部分之一。

我希望能幫助您入門。