antlrの「 'z」が$や£のようなワイルドカードを一致させる理由
質問
次のグラマーを実行したとき:
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
そして、私は入力を与えます「?テスト」ANTLRはなぜこれを有効な入力として受け入れるのですか? ( 'a' .. 'z')は、小文字のアルファベット内の文字のみを一致させると思いましたか?
解決
antlr します 入力文字列を解析するときにエラーを生成します ?test
あなたが投稿した文法で。通常のように、エラーはANTLRの周りで使用されているツールにあります(残念ながらANTLRWORKSでも多くのことが起こると思います!)。
自分で(適切に)テストするには、ファイルを作成します Test.g
:
grammar Test;
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
とファイル Main.java
:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream("?test");
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TestParser parser = new TestParser(tokens);
parser.test();
}
}
のコピーをダウンロードします ANTLR 3.2 jar 同じディレクトリで。
ここで、lexer&parserを生成します:
java -cp antlr-3.2.jar org.antlr.Tool Test.g
すべてのJavaソースファイルをコンパイルします。
javac -cp antlr-3.2.jar *.java
メインクラスを実行します。
java -cp .:antlr-3.2.jar Main
(置き換えます :
と ;
あなたが窓にいるなら!)
次のエラーメッセージが生成されます。
line 1:0 no viable alternative at character '?'
所属していません StackOverflow