Я попытался расширить пример грамматики, которая входит в состав "F # Parsed Language Starter", для поддержки унарного минуса (для выражений типа 2 * -5).
Я попал в блок, как Samsdram здесь
По сути, я расширил заголовок файла .fsy, включив в него приоритет следующим образом:
......
%nonassoc UMINUS
....
, а затем правила грамматики, например, так:
...
Expr:
| MINUS Expr %prec UMINUS { Negative ($2) }
...
также, определение AST:
...
and Expr =
| Negative of Expr
.....
, но все равно выдается ошибка синтаксического анализатора при попытке проанализировать вышеупомянутое выражение.
Есть идеи, чего не хватает?Я прочитал исходный код компилятора F #, и не ясно, как они это решают, похоже, очень похоже
EDIT
Приоритеты упорядочены следующим образом:
%left ASSIGN
%left AND OR
%left EQ NOTEQ LT LTE GTE GT
%left PLUS MINUS
%left ASTER SLASH
%nonassoc UMINUS