コード例 #1
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def fun_decl(s):
    params = s[2]
    body = s[4]
    fn = utils.foldr(syntax.Lambda, params + [body])
    return {
        "lhs": syntax.Ident(s[1].value),
        "rhs": fn,
    }
コード例 #2
0
def std_env(checker: check.Checker) -> StdEnv:
    T = checker.fresh_var()
    U = checker.fresh_var()
    V = checker.fresh_var()
    W = checker.fresh_var()

    return env.Env(locals={
        syntax.Ident("null"): typ.Fn(typ.List(T), typ.Bool),
        syntax.Ident("tail"): typ.Fn(typ.List(U), typ.List(U)),
        syntax.Ident("zero"): typ.Fn(typ.Int, typ.Bool),
        syntax.Ident("succ"): typ.Fn(typ.Int, typ.Int),
        syntax.Ident("pred"): typ.Fn(typ.Int, typ.Int),
        syntax.Ident("times"): typ.Fn(typ.Int, typ.Fn(typ.Int, typ.Int)),
        syntax.Ident("pair"): typ.Fn(V, typ.Fn(W, typ.Tuple(V, W))),
    })
コード例 #3
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def ident_expr(s):
    return syntax.Ident(s[0].value)
コード例 #4
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def fn_expr(s):
    param = syntax.Ident(s[1].value)
    return syntax.Lambda(param, s[3])
コード例 #5
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def params_multi(s):
    return s[0] + [syntax.Ident(s[1].value)]
コード例 #6
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def params_single(s):
    return [syntax.Ident(s[0].value)]
コード例 #7
0
ファイル: parser.py プロジェクト: eignnx/hindley-milner
def val_decl(s):
    return {
        "lhs": syntax.Ident(s[1].value),
        "rhs": s[3],
    }