2

今日、ANTLR3 の実験を始めました。表現に偏りがあるようです。

クラス名を大文字で始め、その後に大文字と数字が混在するようにします。たとえば、Car有効、8Car無効です。

CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;

個別にテストすると、これは正常に機能します。ただし、次のルールで使用すると、

model
    : '~model' CLASS_NAME model_block
    ;

ただし、 はCLASS_NAME数字で始まるクラス名も取得し始めます。この場合、ANTLR はCar8Carまたは#Car有効なトークンとしても取得します。私は何かばかげたことを逃しています。任意のポインタをいただければ幸いです。ありがとう。

4

1 に答える 1

1

CLASS_NAME8Carまたはと一致しません#Car。おそらく ANTLRWorks のインタープリター (または同じインタープリターを使用する Eclipse プラグイン) を使用しているため、認識していない UI タブにエラーが出力され、トークンに誤った文字が表示されます。代わりに ANTLRWorks のデバッガーを使用するか、自分で小さなテスト クラスを作成します。

Tg

grammar T;

parse : CLASS_NAME EOF;

CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;

Main.java

import org.antlr.runtime.*;

public class Main {

  public static void main(String[] args) throws Exception {

    TLexer lexer = new TLexer(new ANTLRStringStream("8Car"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.parse();  
  }
}
于 2013-07-06T20:08:45.647 に答える