以下は、Andrew Appel の Tiger 言語 (ocaml) 用の現在のレクサーとパーサーです。
現在、相互再帰関数をサポートしようとしていますが、次のパーサー コードが機能しません。
decs :
| l = list(dec) { l }
dec :
| t = nonempty_list(loc(tydec)) { S.TypeDec t }
| v = loc(vardec) { S.VarDec v }
| f = nonempty_list(loc(fundec)) { S.FunDec f }
%inline fundec :
| Function fun_name = symbol LPar params = tyfields RPar
Eq body = loc(exp) {
S.{ fun_name; args = params; return_type = None; body }
}
| Function fun_name = symbol LPar params = tyfields RPar
Colon result_type = symbol Eq body = loc(exp) {
S.{ fun_name; args = params; return_type = Some result_type; body }
}
小さな例:
let
function f1(x : int) : int =
f2(x)
function f2(x : int) : int =
f1(x)
in
f1 (0)
end
2 つの要素で構成されるリストをFunDec
持つ単一のトークンではなく、シングルトン リストを持つ2 つのトークンを取得します。FunDec
menhir を使用して のリストを解析するにはどうすればよいfundec
ですか?
PS: 2 番目のパスでこれらのリストをマージできることはわかっていますが、可能であればパーサーにマージしてもらいたいです。