2016-02-16 58 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 –