ここでは、通常の優先順位ルールを使用するハッピーコードとコンテキスト依存優先順位ルールを使用するスニペットがあります(どちらもhereと記載されています)。Happy Context-Dependent Operator Precedence
ノーマル:
%left '+'
%left '*'
%%
Exp :: { Exp }
: Exp '+' Exp { Plus $1 $3 }
| Exp '*' Exp { Times $1 $3 }
| var { Var $1 }
コンテキスト依存:入力を考えると
%left PLUS
%left TIMES
%%
Exp :: { Exp }
: Exp '+' Exp %prec PLUS { Plus $1 $3 }
| Exp '*' Exp %prec TIMES { Times $1 $3 }
| var { Var $1 }
:
a * b + c * d
通常のバージョンが得られます。
Plus (Times (Var "a") (Var "b")) (Times (Var "c") (Var "d"))
をコンテキスト依存のバージョンに対し
ができます:
Times (Var "a") (Plus (Var "b") (Times (Var "c") (Var "c")))
は、これらの両方が同じ出力を与えるべきではないでしょうか。ここで間違っていて、異なる構文解析ツリーを生成させていますか?
これが愚かな質問であれば私は許してください。これは '%left '+'; %left '*' *は '' + ''と'' * ''の優先順位を宣言しますが、'%left PLUS; %left TIMES' *は 'PLUS'と' TIMES'の優先順位を宣言していませんか? –
@DanielWagner:私が書いたことについてはっきりしなかったことは何ですか? '%left '+'; %left '*' 'は' '+ ''と '' * ''の優先順位を宣言し、 '%left PLUS; %left TIMES'は 'PLUS'と' TIMES'の優先順位を宣言します。しかし、優先順位の比較は常にプロダクションと端末の間で行われ、 '%left PLUS; %left TIMES'は ''+''と ''*''の優先順位を宣言しません。それはなぜだろう?'' + ''と' '*''が優先順位を宣言していない場合、 '' PLUS''と 'TIMES'の優先順位を比較することはありません。 – rici
ありがとう、それはそれをクリア!私は、第2の例では '+ 'の優先順位を' +'に比較しようとしていると理解していませんでした( 'PLUS'だけがそこに宣言されているので)。 –