Antlrで新しい言語を開発しようとしています。Antlr4認識できないトークンと指定されたセンテンスを検出する方法が無効です
grammar test;
program : vr'.' to'.' e
;
e: be
| be'.' top'.' be
;
be: 'fg'
| 'fs'
| 'mc'
;
to: 'n'
| 'a'
| 'ev'
;
vr: 'er'
| 'fp'
;
top: 'b'
| 'af'
;
Whitespace : [ \t\r\n]+ ->skip
;
Main.java
String expression = "fp.n.fss";
//String expression = "fp.n.fs.fs";
ANTLRInputStream input = new ANTLRInputStream(expression);
testLexer lexer = new testLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
testParser parser = new testParser(tokens);
//remove listener and add listener does not work
ParseTree parseTree = parser.program();
すべてが有効な文章のために良いです:ここに私の文法ファイルです。しかし、私は意味のあるメッセージを返すために、認識されないトークンと無効な文章を捕捉したい。私の問題の2つのテストケースがあります。
fp.n.fss => anltr gives this error token recognition error at: 's' but i could not handle this error. There are same example error handler class which use BaseErrorListener but in my case it does not work.
fp.n.fs.fs => this sentence is invalid for my grammar but i could not catch. How can i catch invalidations like this sentence?
まずはお手伝いいただきありがとうございます。しかし、私があなたの不具合の解決策を追加しても、「s」にエラートークンの認識エラーがあります。私の場合は、reportInputMismatchメソッドとreportMissingTokenメソッドが機能しません。このエラーを取り除き、意味のあるエラーメッセージを表示するための手順はありますか? – Yunus
@yunskレクサーに戦略を追加したり、エラーを報告したりすることもできます!このエラー戦略は、「認識されないトークン」エラーを処理します。あるいは、あなたはレクサー定義の最後に "Error Token"を追加することができます:ErrorCharacter:。 ;その結果、認識されていないトークンはすべてトークンに捕らえられ、パーサーに送信され、パーサ内のエラー戦略がトリガーされます。 – FDeitelhoff
@FDeitelhoffテストケース:fp.n.fs.fs結果は 未満では、プログラムを入力し、LT(1)= FP は[0,0 @:12 = 'FP'、<4>、1:0]が消費する消費 ルールプログラム[@ 1,13:13 = '。'、<6>、1:13]ルールプログラム 消費[@ 2,14:18 = 'n'、<5>、1:14]ルールプログラム 消費[@ 3,19:ルールプログラム [@ 4,20:27 = 'fs'、<1>、1:20]ルールプログラム 終了プログラム、LT(1)=。 文法に問題はありますか?パーサーが入力を受け付けるようですが、この文は自分の言語では無効です – Yunus