3

私はANTLRにまったく慣れていないので、これはおそらく簡単な質問です。
数字と識別子(文字で始まり、1つ以上の文字または数字で続く文字列)を含む算術式を含むことになっている単純な文法を定義しました。

文法は次のようになります。

grammar while;

@lexer::header {
  package ConFreeG;
}  

@header {
  package ConFreeG;
  
  import ConFreeG.IR.*;
}

@parser::members {
}

arith:
    term
    | '(' arith ( '-' | '+' | '*' ) arith ')'  
    ;
    
term  returns [AExpr a]:    
    NUM
    {
        int n = Integer.parseInt($NUM.text);
        a = new Num(n);
    }
    | IDENT
    {
        a = new Var($IDENT.text);
    }
    ;

fragment LOWER : ('a'..'z');
fragment UPPER : ('A'..'Z');
fragment NONNULL : ('1'..'9');
fragment NUMBER : ('0' | NONNULL);
IDENT  : ( LOWER | UPPER ) ( LOWER | UPPER | NUMBER )*;
NUM    : '0' | NONNULL NUMBER*;

fragment NEWLINE:'\r'? '\n';
WHITESPACE  :   ( ' ' | '\t' | NEWLINE )+ { $channel=HIDDEN; };

ANTLRIDEEclipseプラグインでANTLRv3を使用しています。インタープリターを使用して式を解析する(8 + a45)と、解析ツリーの一部のみが生成されます。

代替テキスト

2番目の項(a45)が解析されないのはなぜですか?両方の用語が数字の場合も同じことが起こります。

4

1 に答える 1

5

(ファイルの終わり)トークンを含むパーサールールを作成してEOF、パーサーがトークンストリーム全体を通過するように強制する必要があります。

このルールを文法に追加します。

parse
  :  arith EOF
  ;

そして、通訳者にルールではなくそのルールから始めさせarithます。

代替テキスト

于 2010-04-06T06:52:09.547 に答える