1

x = y = 5; のように、複数の割り当てを許可する ANTLR で LL(1) グラマーを作成したいと考えています。

この状況ではセマンティック述語が役立つと思いますが、次のルールは機能しません:(

    tokens {
BECOMES = '='
}

    assignment_statement
            :   IDENTIFIER BECOMES expr
            ;

        expr
            :   (IDENTIFIER BECOMES)=> IDENTIFIER BECOMES expr
            |   expr_or
            ;

        IDENTIFIER
            :   LETTER (LETTER | DIGIT)*
            ;

ANTLRWORKS は NoViableAltException を返します。

私が間違っていたことと、これを機能させる方法を知っていますか? ありがとうございました!

4

1 に答える 1

1

もちろん、2 つのトークンを先読みする構文(セマンティックではない) 述語を含む文法は LL(1) ではありません。

ただし、述語は必要ありません。次のようにするだけです。

grammar T;

options {
  output=AST;
}

tokens {
  BECOMES = '=';
}

assignment_statement
 : (IDENTIFIER BECOMES)+ expr ';'
 ;

expr
 : IDENTIFIER
 | NUMBER
 ;

IDENTIFIER
 : LETTER (LETTER | DIGIT)*
 ;

NUMBER
 : DIGIT+
 ;

fragment LETTER : 'a'..'z' | 'A'..'Z';
fragment DIGIT  : '0'..'9';

"x=y=5;"次のように入力を解析します。

ここに画像の説明を入力

のような入力を拒否します"x=2=3;"

また、ANTLRWorks のインタープリターはどのような種類の述語でも機能しません。代わりに ANTLRWorks のデバッガーを使用してください。

于 2012-06-06T18:35:05.340 に答える