私は "Modern Compiler Implementation in ML"を使って、SMLをOCamlに変換しています。この本は、Tigerという言語を定義しています。この言語は、与えられた式のスコープ内の型、変数、関数を宣言するための構文がlet ... in ... end
です。さらに、同じ種類の隣接宣言は、相互再帰を可能にするためにグループ化する必要があります。私は、シフト/紛争を減らす取得するが、立石はそれを私が好きな道を解決し、これによりネストされたリストとのシフト/リダクション
%right FUNCTION TYPE
.
.
.
decs: l = list(dec) { l }
dec:
| l = nonempty_list(tydec) { A.TypeDec l }
| v = vardec { v }
| l = nonempty_list(fundec) { A.FunctionDec l }
tydec:
| TYPE; name = ID; EQUAL; ty = ty {
A.{
type_name = Symbol.symbol name;
type_ty = ty;
type_pos = Position.make $startpos $endpos
}
}
:私はこれを表現しようとした
は以下の文法スニペットと立石です。私はnonempty_list(typec)
を貪欲にして、隣接するTYPE
宣言をまとめてグループ化します。すなわち、立石は、紛争を解決して、私の生成ASTのようなものになります。
(LetExp
(decs
((TypeDec
(((type_name (my_type)) (type_ty (NameTy (int))))
((type_name (my_type2)) (type_ty (NameTy (string))))
))))
(body (SeqExp())))
を私は警告を取り除くしたいのですが、私は矛盾メンヒルと同じ方法を解決するために把握することはできません。私は%inline tydec
を使って試してみましたが、これは警告を消してしまいますが、TYPE
のシフトは私の予想どおりに適用されません。代わりに、好ましいのは、このようになりますAST得、decs
にリストに与えられる:
(LetExp
(decs
((TypeDec
(((type_name (my_type)) (type_ty (NameTy (int))))))
(TypeDec
(((type_name (my_type2)) (type_ty (NameTy (string)))
)))))
(body (SeqExp())))
を私はまた、明示的に優先度を設定しようとしましたが、立石は、それは役に立たない宣言だことを私に警告します。
私はここで何か基本的なものが欠けていると確信しています。リストのリストを生成するプロダクションを与えます。どのようにして内側のリストを貪欲にすることができますか?
回答を書き留めていただきありがとうございます。残念ながら、言語は既に指定されています。私はそれを変更することができますが、私はその本に関連する一連のテストファイルを解析することはできません。 セパレータのほうがはるかに簡単であることは間違いありません。しかし、その核心部分では、 'tydec'リストを一つの' A.TypeDec'に関連させたいと思います。独立した 'A.TypeDec'インスタンスを生成すると、意味解析がかなり複雑になります。 – nirvdrum
私の元の質問でそれが失われた場合に備えて、ちょっと別のポイント。私が警告を残して、Menhirが恣意的に紛争を解決するようにするなら、私は希望の行動を取る。多分それには間違った推論がありますが、私はメンヒルに警告なしで同じ解決策を実行させる方法があると思います。 – nirvdrum
編集していただきありがとうございます。 '%prec'を使うことができず、'%right'が私が望むことをしないなら、他のオプションはあまりないと思います。あなたが提案したような、より侵略的なルールを見ていきます。壊れたレコードのようには聞こえませんが、Menhirはすでに私が望んでいた方法を解決しているので、わかりやすいものを見落としてしまったと思っていました。 – nirvdrum