3

こんにちは私は与えられた入力に基づいてブール式trueまたはfalseを返すjavaまたはc#メソッドを実行したいと思います。例えば:

if(入力がantlr文法と一致する)がtrueを返す; それ以外の場合はfalseを返します。したがって、問題は、commontreeに不一致トークンがあるかどうかを確認する方法がわからないことです。ツリーをトラバースしようとしましたが、ツリーのノードとして不一致トークンが表示されません。おそらく問題は、ASTが不一致のトークンを表示せず、解析ツリーのみを表示することです。誰かがパーサーから解析ツリーを取得する方法を教えてくれた場合にも役立つ可能性がありますか?

ANTLR .gファイルを作成しましたが、正常に機能します。次の手順を実行する必要があります。入力が正しいかどうかを確認する必要があります。これを実行しましたが、機能しません。

 public static boolean check() {
    String file = "test.txt";
    ANTLRReaderStream input;
    try{

            input = new ANTLRReaderStream(new FileReader(file));
            regExLexer lexer = new regExLexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            regExParser parser = new regExParser(tokens);

            CommonTree root = (CommonTree)parser.goal().getTree();

        return true;}
catch{
return false;}
}

したがって、入力文字列が正しい場合にのみtrueを返し、それ以外の場合はfalseを返すことをメソッドから期待しています。私が行った方法では常にtrueが返されますが、文字列が正しくない場合は出力されます

「1:4行の無関係な入力'+'はEOFを期待しています」

コンソールで。

4

2 に答える 2

1

あなたの質問の下のコメントでほのめかしたように、この以前の Q&Aはあなたの質問に答えます。例を挙げて説明します。

数字を受け入れる (そしてスペースを無視する) 文法があるとします。パーサーとレクサーの両方をオーバーライドしreportError、そのメソッドで例外をスローするだけで済みます。この方法では、パーサー (またはレクサー) は続行されません。エラーをキャッチし、単純falsestaticヘルパー メソッドに戻ります。

grammar T;

@parser::members {

  public static boolean matches(String input) {
    try {
      TLexer lexer = new TLexer(new ANTLRStringStream(input));
      TParser parser = new TParser(new CommonTokenStream(lexer));
      parser.parse();
      return true;
    } catch(Exception e) {
      return false;
    }
  }

  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException(e); 
  }
}

@lexer::members {
  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException(e); 
  }
}

parse
 : NUMBER* EOF
 ;

NUMBER : '0'..'9'+;
SPACE  : ' ' {skip();};

クラスを実行しています:

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    System.out.println(TParser.matches(""));
    System.out.println(TParser.matches("1 234 42"));
    System.out.println(TParser.matches("12 556 f"));
  }
}

印刷されます:

true
true
false
于 2012-02-23T16:41:19.213 に答える
0

ANTLR は親切にもいくつかのエラー (明らかなストーケンの欠落など) を回復してくれますが、慣れていない場合は面倒かもしれません。

必要に応じて、regExParser クラスの BaseRecognizer.recoverFromMismatchedToken をオーバーライドして、一致しないトークンが見つかった場合に常に例外をスローすることができます。

参照:

ANTLR: エラーの回復と報告

于 2012-02-23T05:31:37.040 に答える