1

私は数日間、テキストと数字で構成されるテキストを解析しようと試みてきました(文法ではこれを文と呼んでいます)。

    sentence options {
          greedy=false;
     } 
         : (ANY_WORD | INT)+;

INTで終わる文を解析する必要があるルールがあります

    sentence_with_int 
        : sentence INT;

したがって、「購入したサイズ14の靴の数は3でした」という入力がある場合、sentence_with_intは文だけでなく一致します。これを行うためのより良い方法があると確信していますが、私はツールを学んでいます。

ありがとう、リチャード

4

1 に答える 1

2

あなたの文法:


grammar Test;

sentence_with_int 
  :  sentence {System.out.println("Parsed: sentence='"+$sentence.text+"'");}
     INT      {System.out.println("Parsed: int='"+$INT.text+"'");}
  ;

sentence
  : (ANY_WORD | INT)+
  ;

ANY_WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;

INT
  :  ('0'..'9')+
  ;

WS  
  :  (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}
  ;

まさにそれをします。これが小さなテストハーネスです:

import org.antlr.runtime.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("the number of size 14 shoes bought was 3");
        TestLexer lexer = new TestLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokens);
        parser.sentence_with_int();
    }
}

最初にパーサーとレクサーを生成します(すべてのファイルとANTLR jarが同じディレクトリにあると仮定します)。

java -cp antlr-3.2.jar org.antlr.Tool Test.g

.javaそして、すべてのソースファイルをコンパイルします。

javac -cp antlr-3.2.jar * .java

そして最後にDemoクラスを実行します:

java -cp。:antlr-3.2.jarデモ

( Windowsでは、に置き換えます:;

これにより、次の出力が生成されます。

解析済み:sentence='購入したサイズ14の靴の数'
解析済み:int = '3'
于 2010-06-19T06:27:38.607 に答える