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

我需要在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                    { 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