OCaml函数应用程序优先级和关联性
我需要在OCaml解析器中为函数应用程序提供高优先级和左关联性。我有一堆不同的代币可以匹配,比如OCaml函数应用程序优先级和关联性,ocaml,ocamlyacc,Ocaml,Ocamlyacc,我需要在OCaml解析器中为函数应用程序提供高优先级和左关联性。我有一堆不同的代币可以匹配,比如 %token LET REC EQ IN FUN ARROW %token IF THEN ELSE %token PLUS MINUS MUL DIV LT LE NE AND OR %token LPAREN RPAREN 我用%left,right给出了所有这些优先级和关联性。。。 然而,由于我用来匹配的exp不是一个标记,我想知道在这种情况下我该如何做: exp: | exp exp
%token LET REC EQ IN FUN ARROW
%token IF THEN ELSE
%token PLUS MINUS MUL DIV LT LE NE AND OR
%token LPAREN RPAREN
我用%left
,right
给出了所有这些优先级和关联性。。。
然而,由于我用来匹配的exp
不是一个标记,我想知道在这种情况下我该如何做:
exp:
| exp exp { App($1,$2)}
我有exp
的所有匹配项,没有生成一组不同的exp1 exp2等等,我想知道是否可以给exp
exp
最高优先级并保留关联
我在另一个论坛上发布了这篇文章,并得到:
您可以将虚拟令牌与函数应用程序规则关联,如下所示:
rule: .... %precc DUMMY_FUN_APP
然后使用%left和伪标记指定关联性
但是我真的不确定这意味着什么,所以如果有人能详细说明这一点,或者给我另一个解决方案,那就太好了。你没有说你在使用什么解析器生成器。如果您使用的是ocamlyacc,您可以查看OCaml的实际语法以了解想法。你可以在这里找到语法: 在
parser.mly
中,标记按从低到高的优先顺序列出。一些标记是虚拟标记,列出这些标记只是为了建立优先级。然后使用%prec token\u name
从语法规则中引用这些标记
以下是令牌列表的最后几行:
%nonassoc below_SHARP
%nonassoc SHARP /* simple_expr/toplevel_directive */
%nonassoc below_DOT
%nonassoc DOT
/* Finally, the first tokens of simple_expr are above everything else. */
%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT INT INT32 INT64
LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN
NEW NATIVEINT PREFIXOP STRING TRUE UIDENT
请注意,_SHARP下面的虚拟令牌具有非常高的优先级
以下是函数应用的相关规则:
expr:
| simple_expr simple_labeled_expr_list
{ mkexp(Pexp_apply($1, List.rev $2)) }
simple_labeled_expr_list:
labeled_simple_expr
{ [$1] }
| simple_labeled_expr_list labeled_simple_expr
{ $2 :: $1 }
labeled_simple_expr:
simple_expr %prec below_SHARP
{ ("", $1) }
值得一提的是,我总是发现
yacc
关联性和优先级增量非常难理解,除非是在简单的情况下。我最终只使用了带有多个表达式的版本,是的,我使用的是yacc