2

簡単に解析できると思った簡単な文法テストを次に示しますが、すぐに「不一致の入力」が表示され、Antlr が何を探しているのかわかりません。

入力:

  # include "something" program TEST1 { BLAH BLAH }

私の文法:

  grammar ProgHeader;

  program: header* prog EOF ;
  header: '#' ( include | define ) ;
  include: 'include' string ;
  define: 'define' string string? ;
  string: '"' QTEXT '"' ;
  prog: 'program' QTEXT '{' BLOCK '}' ;
  QTEXT: ~[\r\n\"]+ ;
  BLOCK: ~[}]+ ; // don't care, example block
  WS: [ \t\r\n] -> skip ;

出力エラー メッセージ:

line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH '
expecting {'program', '#'}

「#」を探していると表示され、入力の最初に 1 つあるため、これは本当に混乱します。解析ツリーも捨てました。「プログラム」ルールで、一番上にスタックしているように見えます。

(program # include "something" program TEST1 { BLAH BLAH  } )

ハーフ?

重要な場合は、このテスト ケースを実行する完全なプログラムを次に示します (重要ではないと思います。上記の情報で十分ですが、ここにあります)。

  package antlrtests;

  import antlrtests.grammars.*;
  import org.antlr.v4.runtime.*;
  import org.antlr.v4.runtime.tree.*;

  /**
   *
   * @author Brenden Towey
   */
  public class ProgHeaderTest {
     private String[] testVectors = {
        "# include \"something\" program TEST1 { BLAH BLAH } ",
     };
     public void runTests() {
        for( String test : testVectors )
           simpleTest( test );
     }
     private void simpleTest( String test ) {
        ANTLRInputStream ains = new ANTLRInputStream( test );
        ProgHeaderLexer wpl = new ProgHeaderLexer( ains );
        CommonTokenStream tokens = new CommonTokenStream( wpl );
        ProgHeaderParser wikiParser = new ProgHeaderParser( tokens );
        ParseTree parseTree = wikiParser.program();
        System.out.println( "'" + test + "': " + parseTree.toStringTree(
                wikiParser ) );
     }
  }

そして完全な出力:

run:
line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH ' expecting {'program', '#'}
'# include "something" program TEST1 { BLAH BLAH } ': (program # include "something" program TEST1 { BLAH BLAH  } )
BUILD SUCCESSFUL (total time: 0 seconds)
4

1 に答える 1

3

最初に一致する最長のトークンは QTEXT で、これはテキスト# include(最初の"文字までのテキスト) に一致しますが、その時点で有効なトークンは報告されているように「program」と「#」です。そのため、ほとんどすべてに一致するトークン定義は避けたほうがよいでしょう。

于 2013-05-03T18:23:45.670 に答える