Haskell で解析ライブラリを調べていると、このプロジェクトに出くわしました: haskell-parser-examples。いくつかの例を実行すると、演算子の優先順位に問題があることがわかりました。Parsec を使用すると問題なく動作します。
$ echo "3*2+1" | dist/build/lambda-parsec/lambda-parsec
Op Add (Op Mul (Num 3) (Num 2)) (Num 1)
Num 7
しかし、ハッピー/アレックスではそうではありません:
$ echo "3*2+1" | dist/build/lambda-happy-alex/lambda-happy-alex
Op Mul (Num 3) (Op Add (Num 2) (Num 1))
Num 9
演算子の優先順位は明確に定義されているように見えますが。パーサーからの抜粋:
%left '+' '-'
%left '*' '/'
%%
Exprs : Expr { $1 }
| Exprs Expr { App $1 $2 }
Expr : Exprs { $1 }
| let var '=' Expr in Expr end { App (Abs $2 $6) $4 }
| '\\' var '->' Expr { Abs $2 $4 }
| Expr op Expr { Op (opEnc $2) $1 $3 }
| '(' Expr ')' { $2 }
| int { Num $1 }
ヒントはありますか?(しばらく前にバグレポートを開きましたが、応答がありません)。
[gch 7.6.3、alex 3.1.3、happy 1.19.4 を使用]