1

私は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;
}

私は例外を1つだけ取得します:

    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)

編集:

私は付加価値と要素を持っています。ANTLRWorks のグラフ内で ELEMENTS を使用すると、値が表示されません。私は見ることができます:

',' ELEMENTS

それ以外の:

value | value ',' ELEMENTS

これがトークン例外の問題の原因でしょうか? これは実際に許可されていますか?解決策は何ですか?

4

1 に答える 1

1

試す

query           : (STATEMENT)*;

いくつかのアドバイス:

  • のようなルールを避ける

    value | value ',' ELEMENTS
    

両方の選択肢が同じ用語で始まる場合。その用語を「括弧の外」に移動します。

   value (','  value ) * 
  • すべての用語を定義する必要があります (NUMBER は文法で定義されていません)

  • 1 つのルールのみが、他のルールから参照されない用語を定義できます

于 2012-11-21T12:15:34.520 に答える