のドキュメントは次のようにParsec.Expr.buildExpressionParser
述べています。
同じ優先順位のプレフィックス演算子とポストフィックス演算子は1回だけ発生します(つまり、-がプレフィックス否定の場合、-2は許可されません)。
実際、これは私を苦しめています。なぜなら、私が解析しようとしている言語では、接頭辞と接尾辞の演算子を任意に繰り返すことができるからです(のようなC式を考えてみて**a[1][2]
ください)。
では、なぜParsec
この制限を設けるのでしょうか。また、どうすれば回避できますか。
プレフィックス/ポストフィックスパーサーは優先順位が最も高いため、パーサーに移動できると思いますterm
。
すなわち
**a + 1
として解析されます
(*(*(a)))+(1)
しかし、次のように解析したい場合はどうすればよいでしょうか。
*(*((a)+(1)))
buildExpressionParser
やりたいことがあれば、テーブル内の演算子の順序を簡単に並べ替えることができます。
注より良い解決策については、ここを参照してください