2012-11-21 55 views
1

我是Antlr的新手。我定义为使用ANTLR的3Antlr Left Factoring语法

下面我公司语法我的语法:

grammar Grammar; 

@header { 
package com.grammar; 
} 

true  : 'true'; 
false  : 'false'; 
null  : 'null'; 
value  : true | false | null | STRING | NUMBER; 
query   : (STATEMENT+) | STATEMENT?; 
INSERT  : 'INSERT INTO' TABLE 'VALUES' '('ELEMENTS')'';'; 
STATEMENT : INSERT; 
STRING  : ('a'..'z'|'A'..'Z')+; 
INTEGER  : '0'..'9'+; 
ELEMENTS : value | value ',' ELEMENTS; 

当我尝试使用ANTLRWorks生成代码,我得到以下异常:

error (211): Grammar.g.1:8: [fatal] rule Tokens has non-LL(*) decision due to recursive rule invocations reacable from alts 18,24. Resolve by left-factoring or using syntactic predicates or using backtrack=true option 

我看看下面的网站:

http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar

有什么建议可以做什么?我无法在网上找到很多。

当我添加以下内容:

grammar Grammar; 

@options { 
    backtrack=true; 
} 

我得到的只有一个例外:

error(100): Grammar.g:3:2: syntax error: antlr: NoViableAltException([email protected][]) 
    [12:03:20] error(100): Grammar.g:3:2: syntax error: antlr: MissingTokenException (inserted [@-1,0:0='<missing ACTION>',<50>,3:1] at options {) 
    [12:03:20] error(100): Grammar.g:3:2: syntax error: antlr: org.antlr.runtime.EarlyExitException 
[12:03:20] error(150): grammar file Grammar.g has no rules 
    [12:03:20] error(100): Grammar.g:0:1: syntax error: assign.types: MismatchedTreeNodeException(0!=3) 

编辑:

我已增值和元素。在ANTLRWorks的图表中使用ELEMENTS时,无法看到该值。我只能看到:代替

',' ELEMENTS 

value | value ',' ELEMENTS 

难道这是为令牌异常问题的原因是什么?这实际上是允许的吗?解决办法是什么?

回答

1

尝试

query   : (STATEMENT)*; 

几个建议的:

  • 避免规则像

    value | value ',' ELEMENTS 
    

其中两个备选开始用同一个术语。此举术语“走出括号”:

value (',' value) * 
  • 所有条款都必须定义(号码不是在你的语法定义)

  • 只有一个规则可以定义术语,不能从其他引用规则

+0

试过这个,但仍然收到致命令牌异常。 – user1646481

+0

请参阅上面的修改 – user1646481