私は3日間antlrを使用しています。私は表現を解析し、Listenersを書いて、解析木を解釈することができます...それは夢の実現です。antlrリテラル文字列一致:何が間違っていますか?
しかし、私はリテラル文字列 'foo%'と一致しようとしましたが失敗しています。私はこれを行うと主張する多くの例を見つけることができます。私はそれらをすべて試しました。
私はリテラルな文字列にマッチする小さなプロジェクトを作成しました。私は何かばかげているに違いない。
grammar Test;
clause
: stringLiteral EOF
;
fragment ESCAPED_QUOTE : '\\\'';
stringLiteral : '\'' (ESCAPED_QUOTE | ~('\n'|'\r')) + '\'';
簡単なテスト:
public class Test {
@org.junit.Test
public void test() {
String input = "'foo%'";
TestLexer lexer = new TestLexer(new ANTLRInputStream(input));
CommonTokenStream tokens = new CommonTokenStream(lexer);
TestParser parser = new TestParser(tokens);
ParseTree clause = parser.clause();
System.out.println(clause.toStringTree(parser));
ParseTreeWalker walker = new ParseTreeWalker();
}
}
結果:
Running com.example.Test
line 1:1 token recognition error at: 'f'
line 1:2 token recognition error at: 'o'
line 1:3 token recognition error at: 'o'
line 1:4 token recognition error at: '%'
line 1:6 no viable alternative at input '<EOF>'
(clause (stringLiteral ' ') <EOF>)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.128 sec - in com.example.Test
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
フルのmaven化し、ビルドツリーはコードのクイックレビューhere
31行のために利用可能です。そのほとんどは小さな例から借りたものです。
$ mvn clean test
antlr-4.5.2-1を使用してください。
あなたのミスがstringLiteral'は 'ということですパーサールールですが、それはレクサールールでなければなりません。その名前を大文字で始める(あるいは大文字で書くだけで、そのようなレクサーの規則として見つけやすくなります)。 –
ありがとう!それは問題をはっきりさせます! –