0

我需要在我的 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 exp2s 等等,我想知道是否有可能给予exp exp最高优先级并留下关联。

我在另一个论坛上为我的班级发布了这个并得到了:

您可以将虚拟令牌与功能应用程序规则相关联,如下所示:

rule:   ....   %precc DUMMY_FUN_APP

然后使用 %left 和虚拟标记指定关联性。

但是我不确定这意味着什么,所以如果有人可以详细说明这一点或给我另一个很棒的解决方案。

4

1 回答 1

0

你没有说你正在使用什么解析器生成器。如果您使用的是 ocamlyacc,您可能会查看 OCaml 的实际语法以获取想法。你可以在这里找到语法:https ://github.com/ocaml/ocaml/blob/trunk/parsing/parser.mly

parser.mly中,令牌按从低到高的优先顺序排列。一些令牌是虚拟令牌,仅列出以建立优先级。然后使用 . 从语法规则中引用这些标记%prec token_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

请注意,虚拟令牌below_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关联性和优先级声明非常难以理解,除非在简单的情况下。

于 2016-02-16T01:15:42.537 回答