2016-03-28 6 views
4

私は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を使用してください。

+0

あなたのミスがstringLiteral'は 'ということですパーサールールですが、それはレクサールールでなければなりません。その名前を大文字で始める(あるいは大文字で書くだけで、そのようなレクサーの規則として見つけやすくなります)。 –

+0

ありがとう!それは問題をはっきりさせます! –

答えて

2

fragment他のレクサールールでしかルールを使用できません。だから、stringLiteralをパーサルールの代わりにレクサールールにする必要があります。大文字で始めるだけです。

また、それがバックスラッシュと引用符を含めるように否定クラス~('\n'|'\r')を拡大する方が良いでしょう、そしてあなたはエスケープすることができるようにバックスラッシュを含めることができます:

clause 
    : StringLiteral EOF 
    ; 

StringLiteral : '\'' (Escape | ~('\'' | '\\' | '\n' | '\r')) + '\''; 

fragment Escape : '\\' ('\'' | '\\'); 
+0

ありがとう! 1つの小さな違い(大文字と小文字)が違いを生み出しました。そして今、私はレクサーとパーサーのルールを区別することを理解しています! –

関連する問題