2

簡単なラムダ計算文法を書こうとしています (以下を参照)。私が抱えている問題は、関数の適用が左結合ではなく右結合として扱われるように見えることです。たとえば、「f 1 2」は ((f 1) 2) ではなく (f (1 2)) として解析されます。ANTLR にはトークン用の assoc オプションがありますが、関数適用用の演算子がないため、ここでどのように役立つかわかりません。誰かが解決策を見ていますか?

LAMBDA : '\\';
DOT : '.';
OPEN_PAREN : '(';
CLOSE_PAREN : ')';
fragment ID_START : [A-Za-z+\-*/_];
fragment ID_BODY : ID_START | DIGIT;
fragment DIGIT : [0-9];
ID : ID_START ID_BODY*;
NUMBER : DIGIT+ (DOT DIGIT+)?;
WS : [ \t\r\n]+ -> skip;

parse : expr EOF;

expr : variable                     #VariableExpr
     | number                       #ConstantExpr
     | function_def                 #FunctionDefinition
     | expr expr                    #FunctionApplication
     | OPEN_PAREN expr CLOSE_PAREN  #ParenExpr
;
function_def : LAMBDA ID DOT expr;
number : NUMBER; 
variable : ID;

ありがとう!

4

1 に答える 1

2

これにより、左再帰の 4.1 のパターン マッチャーが機能しなくなります。メインブランチでクリーンアップされたと思います。最後のマスターとビルドをダウンロードしてみてください。現在 4.1 では以下が生成されます。

expr[int _p] : ( {} 変数 | 数値 | function_def | OPEN_PAREN expr CLOSE_PAREN ) ( {2 >= $_p}? expr )* ;

そのルールのために。ループ内の expr ref は実際には expr[0] ですが、これは正しくありません。

于 2013-10-28T16:53:55.490 に答える