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