File tree Expand file tree Collapse file tree 2 files changed +39
-8
lines changed Expand file tree Collapse file tree 2 files changed +39
-8
lines changed Original file line number Diff line number Diff line change 1
1
require_relative 'vm_writer'
2
2
3
3
class ExpressionParser
4
+ Number = Struct . new ( :value ) do
5
+ def emit ( vm_writer , _symbol_table )
6
+ vm_writer . write_push ( 'constant' , value )
7
+ end
8
+ end
9
+
10
+ Variable = Struct . new ( :value ) do
11
+ def emit ( vm_writer , symbol_table )
12
+ vm_writer . write_push ( symbol_table . kind_of ( value ) , symbol_table . index_of ( value ) )
13
+ end
14
+ end
15
+
4
16
attr_reader :tokenizer
5
17
private :tokenizer
6
18
@@ -9,12 +21,15 @@ def initialize(tokenizer)
9
21
end
10
22
11
23
def parse
12
- number = tokenizer . int_val
24
+ case tokenizer . token_type
25
+ when Tokenizer ::INT_CONST
26
+ number = tokenizer . int_val
27
+
28
+ Number . new ( number )
29
+ else
30
+ identifier = tokenizer . identifier
13
31
14
- Struct . new ( :value ) {
15
- def emit ( vm_writer )
16
- vm_writer . write_push ( 'constant' , value )
17
- end
18
- } . new ( number )
32
+ Variable . new ( identifier )
33
+ end
19
34
end
20
35
end
Original file line number Diff line number Diff line change 1
1
require 'tokenizer'
2
2
require 'expression_parser'
3
+ require 'symbol_table'
3
4
4
5
RSpec . describe ExpressionParser do
5
6
it 'emits VM code for numeric constants' do
9
10
result = ExpressionParser . new ( tokenizer ) . parse
10
11
output = StringIO . new
11
12
vm_writer = VMWriter . new ( output )
12
- result . emit ( vm_writer )
13
+ result . emit ( vm_writer , SymbolTable . new )
13
14
14
15
expect ( output . string ) . to eq ( "push constant 1\n " )
15
16
end
21
22
result = ExpressionParser . new ( tokenizer ) . parse
22
23
output = StringIO . new
23
24
vm_writer = VMWriter . new ( output )
24
- result . emit ( vm_writer )
25
+ result . emit ( vm_writer , SymbolTable . new )
25
26
26
27
expect ( output . string ) . to eq ( "push constant 2\n " )
27
28
end
29
+
30
+ it 'emits VM code for variables' do
31
+ tokenizer = Tokenizer . new ( 'a' )
32
+ tokenizer . advance
33
+
34
+ symbol_table = SymbolTable . new
35
+ symbol_table . define ( 'a' , :int , :static )
36
+
37
+ result = ExpressionParser . new ( tokenizer ) . parse
38
+ output = StringIO . new
39
+ vm_writer = VMWriter . new ( output )
40
+ result . emit ( vm_writer , symbol_table )
41
+
42
+ expect ( output . string ) . to eq ( "push static 0\n " )
43
+ end
28
44
end
You can’t perform that action at this time.
0 commit comments