我是Antlr的新手。我正在使用Antlr 3为我的公司定义一个语法。
以下是我的语法:
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(55@[])
[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)
编辑:
我增加了价值和ELEMENTS。在ANTLRWorks中使用图形内部的ELEMENTS时,无法看到该值。我只能看到:
',' ELEMENTS
而不是:
value | value ',' ELEMENTS
这可能是令牌异常问题的原因吗?这实际上是允许的吗?解决方案是什么?
答案 0 :(得分:1)
试
query : (STATEMENT)*;
一些建议:
避免像
这样的规则value | value ',' ELEMENTS
其中两种替代方案都以相同的术语开头。将该术语移出“括号内”:
value (',' value ) *
必须定义所有术语(语法中未定义NUMBER)
只有一个规则可以定义未从其他规则引用的术语