1

ラムダ式のパーサーを書き、

data expr = Symbol of string | Lambda of string * expr | App of expr * expr

ファイルを作成するとき.mly、式のシーケンスという考えをどのように表現できますか

e1 e2 e3 e4 

として解析する必要があります

App ((App (App e1 e2) e3) e4)

ルールの使用:

%public expr_expr:
    | ID        { Symbol ($1) }
    | NUMBER    { Symbol ($1) }
    | LPAREN expr_expr RPAREN { ($2) }
    | LAMBDA ID ARROW expr_expr { Lambda ($2, $4) }
    | expr_expr expr_expr { Apply ($1, $2) }

(e1 , (e2 , (e3 , e4)))とは対照的に、構造を与える(((e1, e2), e3), e4)。トークンではなくルールの結合性を制御する方法はありますか?

4

1 に答える 1

2

免責事項:私はocamlyaccではなくを使用menhirしているので、前者に基づいて答えています。AFAIUI、後者は下位互換性があるため、とにかく私の答えが役立つと思います。

ドキュメントhttp://caml.inria.fr/pub/docs/manual-ocaml/lexyacc.htmlを引用:

ルールには、右側の部分に %prec シンボル ディレクティブを含めることもできます。これにより、ルールのデフォルトの優先順位と結合性が、指定されたシンボルの優先順位と結合性でオーバーライドされます。

だから私は試してみます

%left Application

ルールを連想のままにし(優先順位を定義する場所。少なくともアプリケーションとラムダ抽象化の相対的な優先順位を定義する必要があります)、ルールを次のように変更します

| expr_expr expr_expr { Apply ($1, $2) } %prec Application

これによりApplication、結合性と優先順位を割り当てるためだけに使用されるダミー シンボルが作成されます。

注 1: 上記は部分的に私の推測です。どうやら私はそのように自分で試したことはありませんでした。かつてラムダ文法を書いたとき、文法を変更して結合性を強化しました。

注 2: 上記のように動作しない場合は、OCaml のソース コードをのぞいてみてください。OCaml 言語には、アプリケーションの同じ構文があります。

于 2016-12-18T07:58:51.833 に答える