-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
107 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
] |