关于ocamlyacc,函数应用语法和优先级
我是OCaml新手,我正在尝试编写一个类似OCaml的简单语法,我无法弄清楚这一点。我的语法允许这样的事情:
let sub = fun x -> fun y -> x - y;;
但是,如果我想使用如此定义的函数,我可以写:(sub 7) 3
但是我不能写sub 7 3
,这真的让我感到烦恼。由于某种原因,它被解释为好像我写了sub (7 3)
(将7
视为带参数3
的函数)。相关部分是:
/* other operators, then at the very end: */
%left APPLY
/* ... */
expr:
/* ... */
| expr expr %prec APPLY { Apply($1, $2) }
谢谢!
没有找到相关结果
已邀请:
3 个回复
弓萍功
)
其中
是可能的expr值的子集,可以在不需要括号的情况下求值到函数。这排除了所有非自括式构造与函数调用一起使用。它还阐明了子表达式的相关性,因为第二个子表达式明确是一个列表。 至于为什么你试图使用
来获得正确的关联性不起作用,从ocaml的parser.mly中的注释:
我想这意味着你不能在没有运算符的情况下将%prec用于关联性。尝试通过定义更多规则来创建所需的关联性,并查看其引导的位置。
社攻取墟槽
递归解决方法实际上是为了捕捉我们关注这个问题的情况,但是很容易看出它如何应用于定义其余表达式的关联性。 这种方法的要点是尝试将所讨论的模式与开始案例(exp)中定义的模式进行匹配,如果您的模式不是,则将对紧接着的案例(exp2)的调用作为一个包含所有模式在它之前匹配;继续这种方法,直到模式最终匹配。这意味着最高优先级模式存在于最远的情况下 - 在本例中为exp8。 在此示例中,Apply(Function Application)的情况在exp7中。这是因为Apply被定义为在此示例中具有任何模式的最高关联性。它没有优先于exp8中的情况的原因是由于Apply评估对表达式情况的进一步调用,而不是值调用。如果exp8不存在,我们手上就会有无限的外观。 在假设的simple.ml中,Function Application被定义为以下属性的表达式:应用expr * expr。由于Apply是左递归的,我们正在评估正确的表达式(exp8)并在左侧(exp7)进行递归。
卧沫