Add symbol type

This commit is contained in:
백현웅 2022-02-08 00:26:03 +09:00
parent 95684a31df
commit 700356022b
6 changed files with 41 additions and 24 deletions

22
ast.ml
View file

@ -1,28 +1,9 @@
module Type = struct
type t =
| Int
| Float
| Function
| External
| String
let to_string = function
| Int -> "int"
| Float -> "float"
| String -> "string"
| Function -> "fun"
| External -> "external"
let supertype = function
| Int -> Some Float
| _ -> None
end
(* simple, untyped AST. *)
type t =
| Nint of int
| Nfloat of float
| Nstring of string
| Nsymbol of string
| Nfunction of string list * t
| Nexternal of string
| Var of string
@ -64,6 +45,7 @@ let print ast =
| Nint n -> pr "%d" n
| Nfloat n -> pr "%f" n
| Nstring s -> pr "\"%s\"" s
| Nsymbol s -> pr "#%s" s
| Nfunction (args, e) ->
pr "lambda (%s" @@ List.hd args;
List.iter (pr " %s") @@ List.tl args;

26
env.ml
View file

@ -7,20 +7,43 @@ and value =
| Int of int
| Float of float
| String of string
| Symbol of string
| Function of string list * expr
| External of string
| Nop (* return of system operations (will be deprecated) *)
and expr = Ast.t
module Type = struct
type t =
| Int
| Float
| String
| Symbol
| Function
| External
let to_string = function
| Int -> "int"
| Float -> "float"
| String -> "string"
| Symbol -> "symbol"
| Function -> "fun"
| External -> "external"
let supertype = function
| Int -> Some Float
| _ -> None
end
module Value = struct
module Type = Ast.Type
type t = value
let to_string = function
| Int n -> string_of_int n
| Float n -> string_of_float n
| String s -> "\"" ^ s ^ "\""
| Symbol s -> "symbol " ^ s
| Function (vars, _) ->
Printf.sprintf "function with %d arguments" @@ List.length vars
| External f -> "external " ^ f
@ -30,6 +53,7 @@ module Value = struct
| Int _ -> Type.Int
| Float _ -> Type.Float
| String _ -> Type.String
| Symbol _ -> Type.Symbol
| Function _ -> Type.Function
| External _ -> Type.External
| Nop -> failwith "Value.typeof"

View file

@ -5,10 +5,10 @@ open Env.Value
exception No_operation
exception No_such_variable of string
exception No_such_function of string
exception Invalid_type of Type.t
exception Too_many_arguments
exception Invalid_type of Type.t
(* operators *)
module Operator = struct
type t = Ast.operator
@ -125,6 +125,7 @@ let rec eval env ast =
| Nint n -> Int n
| Nfloat n -> Float n
| Nstring s -> String s
| Nsymbol s -> Symbol s
| Nfunction (args, e) -> Function (args, e)
| Nexternal f -> External f
| Var v -> begin match Env.get_opt env v with

View file

@ -8,7 +8,7 @@ let error_to_string e =
| Lex.Expected c -> sprintf "expected %c" c
| Parser.Expected t -> sprintf "expected %s" t
| Parser.Unexpected_token t -> sprintf "unexpected token \"%s\"" t
| Eval.Invalid_type t -> sprintf "invalid type %s" (Ast.Type.to_string t)
| Eval.Invalid_type t -> sprintf "invalid type %s" (Env.Type.to_string t)
| Eval.No_such_variable v -> sprintf "no such variable %s" v
| Eval.No_such_function f -> sprintf "no such function \"%s\"" f
| Eval.Too_many_arguments -> "applied too many arguments"

View file

@ -70,6 +70,11 @@ let token_is_operator tok =
(* common parsers *)
let any seq =
match seq () with
| Seq.Nil -> raise End_of_tokens
| Seq.Cons (x, seq) -> x, seq
let token tok seq =
match seq () with
| Seq.Nil -> expected @@ Token.to_string tok
@ -229,6 +234,9 @@ and value seq =
| Int x -> Nint x, seq
| Float x -> Nfloat x, seq
| String x -> Nstring x, seq
| Hash ->
let t, seq = any seq in
Nsymbol (Token.to_string t), seq
| LParen ->
let e, seq = expr min_int seq in
let _, seq = token RParen seq in

View file

@ -12,6 +12,7 @@ type t =
| LParen
| RParen
| Equal
| Hash
| Right_arrow
let tokens = ref [
@ -25,6 +26,7 @@ let tokens = ref [
"(", LParen;
")", RParen;
"=", Equal;
"#", Hash;
]
let to_string = function