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 exp2 などを作成していないため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 に答える