2009-12-16 93 views
5

嘿。我是ANTLR的新手。 ANTLRWorks嚮導wrrited我下面的代碼:ANTLR「子樹意外結束」

grammar test; 

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

INT : '0'..'9'+ 
    ; 

FLOAT 
    : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? 
    | '.' ('0'..'9')+ EXPONENT? 
    | ('0'..'9')+ EXPONENT 
    ; 

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

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

STRING 
    : '"' (ESC_SEQ | ~('\\'|'"'))* '"' 
    ; 
CHAR: '\'' (ESC_SEQ | ~('\''|'\\')) '\'' 
    ; 

fragment 
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UNICODE_ESC 
    | OCTAL_ESC 
    ; 

fragment 
OCTAL_ESC 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UNICODE_ESC 
    : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
    ; 

調試時,它引發以下錯誤:

[22:45:49] error(100): C:\Documents and Settings\user\Desktop\test.g:0:0: syntax error: codegen: <AST>:0:0: unexpected end of subtree 

有人可以解釋我什麼是錯誤,它在哪裏,我怎麼能解決它?

謝謝。

回答

7

在ANTLR中,以大寫字母開頭的每個規則都是詞法分析規則。以小寫字母開頭的是解析器規則。正如你所看到的,你只有詞法規則:這就是你的問題。您必須至少有一個解析器規則。如果添加以下規則:

parse 
    : ID 
    | INT 
    | // ... 
    ; 

爲您的詞法分析器/分析器生成源文件時,該錯誤將消失。

2

聲明:我對ANTLR嚮導一無所知。

谷歌搜索變成了這句話:

Usually "unexpected end of subtree" means you forgot to make something a root in the parser.

這對我來說很有意義,如果你的文件應該指定一個語法,而不是隻爲詞法分析規則。你的文件的第一行是「語法測試」,所以推測這是一個語法。

語法可讓您將一系列終端符號縮減爲單個非終結符號。因此,例如,代表完全括號表達式一個非常簡單的語法是這樣的:

P : E 
E : (X) 
    | E E 
    | (E) 
X : 'x' 

這裏,P是根,因爲所有的句子最終減少到P.如果一個句子不能降低到P,它不符合這個語法。所以,你需要爲你的語法找到一個根,而所有其他的產品只能在根的上下文中出現(即通過直接或間接的推導)。

+0

請注意,由於ANTLR生成LL(*)解析器,因此無法應付您發佈的左遞歸語法。 http://www.antlr.org/wiki/display/ANTLR3/Left-Recursion+Removal – 2009-12-17 09:23:11

+0

啊,好吧 - 以我剛剛假設的「LR」結尾的ANTLR。 – danben 2009-12-17 15:19:40

+0

:)的確如此,這個名字暗示了另一種說法。 ANTLR代表「用於** L **語言** R **生態識別的另一種工具」。 – 2009-12-17 16:47:02