Skip to content

Commit

Permalink
Chapter 11: implement symboltable
Browse files Browse the repository at this point in the history
  • Loading branch information
ohbarye committed Jun 20, 2020
1 parent ea6a742 commit f8777e5
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 2 deletions.
80 changes: 80 additions & 0 deletions projects/11/jack_analyzer/lib/symbolTable.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
type identifierKind = FIELD | STATIC | VAR | ARG

type identifier = {
identifier_type : string;
kind : identifierKind;
index : int;
}

module Table = Map.Make(String)

type symbolTable = {
mutable static_table : identifier Table.t;
mutable field_table : identifier Table.t;
mutable arg_table : identifier Table.t;
mutable var_table : identifier Table.t;
}

let create =
{
static_table = Table.empty;
field_table = Table.empty;
arg_table = Table.empty;
var_table = Table.empty;
}

let define name identifier_type kind table =
match kind with
| STATIC ->
let index = Table.cardinal table.static_table in
let id = { identifier_type = identifier_type; kind = kind; index = index } in
table.static_table <- Table.add name id table.static_table;
table
| FIELD ->
let index = Table.cardinal table.field_table in
let id = { identifier_type = identifier_type; kind = kind; index = index } in
table.field_table <- Table.add name id table.field_table;
table
| ARG ->
let index = Table.cardinal table.arg_table in
let id = { identifier_type = identifier_type; kind = kind; index = index } in
table.arg_table <- Table.add name id table.arg_table;
table
| VAR ->
let index = Table.cardinal table.var_table in
let id = { identifier_type = identifier_type; kind = kind; index = index } in
table.var_table <- Table.add name id table.var_table;
table

let start_subroutine table =
table.arg_table <- Table.empty;
table.var_table <- Table.empty;
table

let find name table =
match name with
| _ when Table.mem name table.static_table ->
Some (Table.find name table.static_table)
| _ when Table.mem name table.field_table ->
Some (Table.find name table.field_table)
| _ when Table.mem name table.arg_table ->
Some (Table.find name table.arg_table)
| _ when Table.mem name table.var_table ->
Some (Table.find name table.var_table)
| _ ->
None

let kind_of name table =
match find name table with
| Some id -> Some (id.kind)
| None -> None

let type_of name table =
match find name table with
| Some id -> Some (id.identifier_type)
| None -> None

let index_of name table =
match find name table with
| Some id -> Some (id.index)
| None -> None
9 changes: 9 additions & 0 deletions projects/11/jack_analyzer/lib/symbolTable.mli
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
type symbolTable
type identifierKind = FIELD | STATIC | VAR | ARG

val create : symbolTable
val define : string -> string -> identifierKind -> symbolTable -> symbolTable
val start_subroutine : symbolTable -> symbolTable
val kind_of : string -> symbolTable -> identifierKind option
val type_of : string -> symbolTable -> string option
val index_of : string -> symbolTable -> int option
5 changes: 3 additions & 2 deletions projects/11/jack_analyzer/test/run_tests.ml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
let test_suites: unit Alcotest.test list = [
"JackTokenizer", JackTokenizer.tests;
"CompilerEngine", CompilerEngine.tests;
(* "JackTokenizer", JackTokenizer.tests;
"CompilerEngine", CompilerEngine.tests; *)
"SymbolTable", SymbolTable.tests;
]

let () = Alcotest.run "proj" test_suites
15 changes: 15 additions & 0 deletions projects/11/jack_analyzer/test/symbolTable.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module To_test = struct
(* let table = Nand2tetris_compiler.SymbolTable.Table *)
let create = Nand2tetris_compiler.SymbolTable.create
let define = Nand2tetris_compiler.SymbolTable.define
end

module Table = Map.Make(String)

let test_create () =
let table = To_test.create in
Alcotest.(check bool "same list" (Table.mem "" table.static_table) false)

let tests = [
"test_tokenize_unit", `Quick, test_create;
]

0 comments on commit f8777e5

Please sign in to comment.