В документации для Parsec.Expr.buildExpressionParser
указано:
Префиксные и постфиксные операторы с одинаковым приоритетом могут возникать только один раз (т.е. - 2 не допускается, если - префикс отрицателен).
и, действительно, это укусит меня, поскольку язык, который я пытаюсь выполнить, позволяет произвольно повторять его префикс и постфиксные операторы (подумайте о выражении C, как **a[1][2]
).
Итак, почему Parsec
делает это ограничение и как я могу его обойти?
Я думаю, что могу перенести свои синтаксические анализаторы префикса/постфикса в парсер term
, поскольку они имеют самый высокий приоритет.
то есть.
**a + 1
анализируется как
(*(*(a)))+(1)
но что я мог сделать, если бы я хотел, чтобы он разбирался как
*(*((a)+(1)))
Если buildExpressionParser
сделал то, что я хочу, я мог бы просто перестроить порядок операторов в таблице.
Примечание См. здесь для лучшего решения