2009-12-16 33 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