我试图扩展作为“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