2016-02-16 59 views
0

我需要在OCaml解析器中给予高优先级和左关联性来运行应用程序。我有一大堆不同的令牌它如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 

匹配,我给所有这些优先级和结合使用%leftright ... 然而,由于exp我使用,以配合ISN”吨令牌我不知道我会怎么做,在这种情况下:

exp: 
| exp exp     { App($1,$2)} 

我有所有我的exp比赛,didnt让一群不同的EXP1 exp2s的等等,想知道它可能给expexp最高优先级a nd左边联合它。

我张贴这在另一个论坛,我的课,并得到:

您可以将虚拟令牌的功能应用规则如下关联:

rule: .... %precc DUMMY_FUN_APP 

,然后用%左指定关联性和虚拟标记。

但我不太确定这是什么意思,所以如果有人能详细说明这个问题或给我另一个很好的解决方案。

回答

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关联性和优先级delcarations是非常棘手的,除了在简单的情况了解。

+0

我结束了刚刚使用多个exprs版本,是的,我使用的是yacc –