2012-11-21 54 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