「F#Parsed Language Starter」の一部として提供されているサンプル文法を拡張して、単項マイナス(2 * -5などの式の場合)をサポートしようとしました。
ここでSamsdramのようなブロックをヒットしました
基本的に、次のように.fsyファイルのヘッダーを拡張して優先順位を含めました。
......
%nonassoc UMINUS
....
そして、そのような文法の規則:
...
Expr:
| MINUS Expr %prec UMINUS { Negative ($2) }
...
また、ASTの定義:
...
and Expr =
| Negative of Expr
.....
ただし、上記の式を解析しようとすると、パーサーエラーが発生します。
何が欠けているのかアイデアはありますか?F#コンパイラのソースコードを読みましたが、これをどのように解決するかは明確ではありませんが、非常に似ているようです
編集
優先順位は次のように順序付けられます。
%left ASSIGN
%left AND OR
%left EQ NOTEQ LT LTE GTE GT
%left PLUS MINUS
%left ASTER SLASH
%nonassoc UMINUS