ajlisp 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/LICENSE +23 -0
  2. data/README.md +33 -0
  3. data/ajlisp.gemspec +20 -0
  4. data/lib/ajlisp.rb +128 -0
  5. data/lib/ajlisp/at_constant_atom.rb +30 -0
  6. data/lib/ajlisp/context.rb +27 -0
  7. data/lib/ajlisp/dot_verb_atom.rb +31 -0
  8. data/lib/ajlisp/file_source.rb +10 -0
  9. data/lib/ajlisp/fprimitive.rb +23 -0
  10. data/lib/ajlisp/fprimitive_closure.rb +48 -0
  11. data/lib/ajlisp/fprimitive_define.rb +30 -0
  12. data/lib/ajlisp/fprimitive_definef.rb +30 -0
  13. data/lib/ajlisp/fprimitive_definem.rb +30 -0
  14. data/lib/ajlisp/fprimitive_do.rb +25 -0
  15. data/lib/ajlisp/fprimitive_flambda.rb +21 -0
  16. data/lib/ajlisp/fprimitive_if.rb +34 -0
  17. data/lib/ajlisp/fprimitive_lambda.rb +21 -0
  18. data/lib/ajlisp/fprimitive_let.rb +38 -0
  19. data/lib/ajlisp/fprimitive_macro_closure.rb +13 -0
  20. data/lib/ajlisp/fprimitive_mlambda.rb +21 -0
  21. data/lib/ajlisp/fprimitive_quote.rb +19 -0
  22. data/lib/ajlisp/input_source.rb +37 -0
  23. data/lib/ajlisp/lexer.rb +132 -0
  24. data/lib/ajlisp/list.rb +106 -0
  25. data/lib/ajlisp/named_atom.rb +34 -0
  26. data/lib/ajlisp/nil_atom.rb +39 -0
  27. data/lib/ajlisp/parser.rb +80 -0
  28. data/lib/ajlisp/primitive.rb +19 -0
  29. data/lib/ajlisp/primitive_add.rb +29 -0
  30. data/lib/ajlisp/primitive_closure.rb +49 -0
  31. data/lib/ajlisp/primitive_comparisons.rb +84 -0
  32. data/lib/ajlisp/primitive_cons.rb +19 -0
  33. data/lib/ajlisp/primitive_divide.rb +25 -0
  34. data/lib/ajlisp/primitive_eval.rb +19 -0
  35. data/lib/ajlisp/primitive_first.rb +19 -0
  36. data/lib/ajlisp/primitive_list.rb +19 -0
  37. data/lib/ajlisp/primitive_load.rb +34 -0
  38. data/lib/ajlisp/primitive_multiply.rb +25 -0
  39. data/lib/ajlisp/primitive_predicates.rb +58 -0
  40. data/lib/ajlisp/primitive_rest.rb +19 -0
  41. data/lib/ajlisp/primitive_subtract.rb +25 -0
  42. data/lib/ajlisp/string_source.rb +28 -0
  43. data/lib/ajlisp/token.rb +23 -0
  44. data/lib/core.lsp +40 -0
  45. data/test/and.lsp +1 -0
  46. data/test/append.lsp +1 -0
  47. data/test/backquote.lsp +7 -0
  48. data/test/cond.lsp +1 -0
  49. data/test/define123.lsp +4 -0
  50. data/test/definem.lsp +1 -0
  51. data/test/dodefine123.lsp +5 -0
  52. data/test/mapcond.lsp +13 -0
  53. data/test/mapfirst.lsp +10 -0
  54. data/test/mycons.lsp +3 -0
  55. data/test/test.rb +42 -0
  56. data/test/test_at_constant_atom.rb +34 -0
  57. data/test/test_context.rb +37 -0
  58. data/test/test_dot_verb_atom.rb +29 -0
  59. data/test/test_evaluate.rb +289 -0
  60. data/test/test_evaluate_files.rb +136 -0
  61. data/test/test_file_source.rb +11 -0
  62. data/test/test_fprimitive_closure.rb +29 -0
  63. data/test/test_fprimitive_define.rb +65 -0
  64. data/test/test_fprimitive_definef.rb +20 -0
  65. data/test/test_fprimitive_definem.rb +20 -0
  66. data/test/test_fprimitive_do.rb +18 -0
  67. data/test/test_fprimitive_flambda.rb +15 -0
  68. data/test/test_fprimitive_if.rb +29 -0
  69. data/test/test_fprimitive_lambda.rb +15 -0
  70. data/test/test_fprimitive_let.rb +18 -0
  71. data/test/test_fprimitive_macro_closure.rb +17 -0
  72. data/test/test_fprimitive_mlambda.rb +12 -0
  73. data/test/test_fprimitive_quote.rb +35 -0
  74. data/test/test_lexer.rb +208 -0
  75. data/test/test_list.rb +102 -0
  76. data/test/test_load.rb +74 -0
  77. data/test/test_named_atom.rb +33 -0
  78. data/test/test_parser.rb +252 -0
  79. data/test/test_primitive_add.rb +26 -0
  80. data/test/test_primitive_closure.rb +29 -0
  81. data/test/test_primitive_cons.rb +39 -0
  82. data/test/test_primitive_eval.rb +13 -0
  83. data/test/test_primitive_first.rb +25 -0
  84. data/test/test_primitive_list.rb +27 -0
  85. data/test/test_primitive_rest.rb +29 -0
  86. data/test/test_string_source.rb +10 -0
  87. data/test/test_token.rb +14 -0
  88. metadata +131 -0
@@ -0,0 +1,11 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFileSource < Test::Unit::TestCase
5
+ def test_next_char
6
+ source = AjLisp::FileSource.new __FILE__
7
+ assert 'r', source.nextChar
8
+ assert 'e', source.nextChar
9
+ assert 'q', source.nextChar
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveClosure < Test::Unit::TestCase
5
+ def test_new_with_no_context
6
+ arguments = AjLisp::List.make [ :a, :b ]
7
+ body = AjLisp::List.make [[ :cons, :a, :b ]]
8
+ closure = AjLisp::FPrimitiveClosure.new arguments, body
9
+ assert_equal arguments, closure.arguments
10
+ assert_equal body, closure.body
11
+ assert_nil closure.context
12
+ end
13
+
14
+ def test_evaluate_simple_body
15
+ arguments = AjLisp::List.make [ :a, :b ]
16
+ body = [ AjLisp::List.make([ :cons, :a, :b ])]
17
+ closure = AjLisp::FPrimitiveClosure.new arguments, body
18
+ list = AjLisp::List.make [closure, "a", [:b, :c]]
19
+
20
+ result = closure.evaluate(AjLisp::context, list)
21
+
22
+ assert_not_nil result
23
+ assert result.is_a? AjLisp::List
24
+ assert_equal "a", result.first
25
+ assert_equal :b, result.rest.first.name
26
+ assert_equal :c, result.rest.rest.first.name
27
+ assert_nil result.rest.rest.rest
28
+ end
29
+ end
@@ -0,0 +1,65 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveDefine < Test::Unit::TestCase
5
+ def test_evaluate_define_atom_as_constant
6
+ list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :a, 1]
7
+
8
+ result = list.evaluate(AjLisp::context)
9
+
10
+ assert_equal 1, result
11
+ assert_equal 1, AjLisp::context.getValue(:a)
12
+ end
13
+
14
+ def test_evaluate_define_two_atoms
15
+ list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :a, 1]
16
+ result = list.evaluate(AjLisp::context)
17
+
18
+ list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :b, :a]
19
+ result = list.evaluate(AjLisp::context)
20
+
21
+ assert_equal 1, result
22
+ assert_equal 1, AjLisp::context.getValue(:a)
23
+ assert_equal 1, AjLisp::context.getValue(:b)
24
+ end
25
+
26
+ def test_evaluate_define_atom_as_lambda
27
+ list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :mycons, [:lambda, [:a, :b], [:cons, :a, :b]]]
28
+
29
+ result = list.evaluate(AjLisp::context)
30
+
31
+ assert result.is_a? AjLisp::PrimitiveClosure
32
+
33
+ list = AjLisp::List.make [:mycons, 1, [:quote, [:b, :c]]]
34
+
35
+ result = list.evaluate(AjLisp::context)
36
+
37
+ assert_not_nil result
38
+ assert result.is_a? AjLisp::List
39
+ assert_equal 1, result.first
40
+ assert_equal :b, result.rest.first.name
41
+ assert_equal :c, result.rest.rest.first.name
42
+ assert_nil result.rest.rest.rest
43
+ end
44
+
45
+ def test_evaluate_define_form
46
+ list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :mycons, [:a, :b], [:cons, :a, :b]]
47
+
48
+ result = list.evaluate(AjLisp::context)
49
+
50
+ assert_not_nil result
51
+ assert result.is_a? AjLisp::PrimitiveClosure
52
+
53
+ list = AjLisp::List.make [:mycons, 1, [:quote, [:b, :c]]]
54
+
55
+ result = list.evaluate(AjLisp::context)
56
+
57
+ assert_not_nil result
58
+ assert result.is_a? AjLisp::List
59
+ assert_equal 1, result.first
60
+ assert_equal :b, result.rest.first.name
61
+ assert_equal :c, result.rest.rest.first.name
62
+ assert_nil result.rest.rest.rest
63
+ end
64
+ end
65
+
@@ -0,0 +1,20 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveDefinef < Test::Unit::TestCase
5
+ def test_evaluate_definef_form_myquote
6
+ list = AjLisp::List.make [:definef, :myquote, [:x], :x]
7
+
8
+ result = list.evaluate(AjLisp::context)
9
+
10
+ assert_not_nil AjLisp::context.getValue(:myquote)
11
+
12
+ list = AjLisp::List.make [:myquote, :a]
13
+ result = list.evaluate(AjLisp::context)
14
+
15
+ assert_not_nil result
16
+ assert result.is_a? AjLisp::NamedAtom
17
+ assert_equal :a, result.name
18
+ end
19
+ end
20
+
@@ -0,0 +1,20 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveDefinem < Test::Unit::TestCase
5
+ def test_evaluate_definem_form
6
+ list = AjLisp::List.make [:definem, :mycompose, [:a, :b], [:list, :a, :b]]
7
+
8
+ result = list.evaluate(AjLisp::context)
9
+
10
+ assert_not_nil AjLisp::context.getValue(:mycompose)
11
+
12
+ list = AjLisp::List.make [:mycompose, :first, [:quote, [:a, :b]]]
13
+ result = list.evaluate(AjLisp::context)
14
+
15
+ assert_not_nil result
16
+ assert result.is_a? AjLisp::NamedAtom
17
+ assert_equal :a, result.name
18
+ end
19
+ end
20
+
@@ -0,0 +1,18 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveDo < Test::Unit::TestCase
5
+ def test_evaluate_simple_body
6
+ doform = AjLisp::FPrimitiveDo.instance
7
+ list = AjLisp::List.make [doform, [:define, :a, 1], [:define, :b, 2], [:define, :c, 3] ]
8
+
9
+ result = doform.evaluate(AjLisp::context, list)
10
+
11
+ assert_not_nil result
12
+ assert_equal 3, result
13
+ assert_equal 1, AjLisp::context.getValue(:a)
14
+ assert_equal 2, AjLisp::context.getValue(:b)
15
+ assert_equal 3, AjLisp::context.getValue(:c)
16
+ end
17
+ end
18
+
@@ -0,0 +1,15 @@
1
+
2
+ require 'ajlisp'
3
+ require 'test/unit'
4
+
5
+ class TestFPrimitiveFLambda < Test::Unit::TestCase
6
+ def test_evaluate
7
+ list = AjLisp::List.make [[:flambda, [:a, :b], [:cons, :a, :b]], "a", [:b, :c]]
8
+ result = list.evaluate(AjLisp::context)
9
+ assert result.is_a? AjLisp::List
10
+ assert_equal "a", result.first
11
+ assert_equal :b, result.rest.first.name
12
+ assert_equal :c, result.rest.rest.first.name
13
+ assert_nil result.rest.rest.rest
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveIf < Test::Unit::TestCase
5
+ def test_evaluate_if_false
6
+ ifform = AjLisp::FPrimitiveIf.instance
7
+ list = AjLisp::List.make [ifform, false, [:define, :b1, 2], [:define, :c1, 3] ]
8
+
9
+ result = ifform.evaluate(AjLisp::context, list)
10
+
11
+ assert_not_nil result
12
+ assert_equal 3, result
13
+ assert_nil AjLisp::context.getValue(:b1)
14
+ assert_equal 3, AjLisp::context.getValue(:c1)
15
+ end
16
+
17
+ def test_evaluate_if_true
18
+ ifform = AjLisp::FPrimitiveIf.instance
19
+ list = AjLisp::List.make [ifform, true, [:define, :b2, 2], [:define, :c2, 3] ]
20
+
21
+ result = ifform.evaluate(AjLisp::context, list)
22
+
23
+ assert_not_nil result
24
+ assert_equal 2, result
25
+ assert_equal 2, AjLisp::context.getValue(:b2)
26
+ assert_nil AjLisp::context.getValue(:c2)
27
+ end
28
+ end
29
+
@@ -0,0 +1,15 @@
1
+
2
+ require 'ajlisp'
3
+ require 'test/unit'
4
+
5
+ class TestFPrimitiveLambda < Test::Unit::TestCase
6
+ def test_evaluate
7
+ list = AjLisp::List.make [[:lambda, [:a, :b], [:cons, :a, :b]], "a", [:quote, [:b, :c]]]
8
+ result = list.evaluate(AjLisp::context)
9
+ assert result.is_a? AjLisp::List
10
+ assert_equal "a", result.first
11
+ assert_equal :b, result.rest.first.name
12
+ assert_equal :c, result.rest.rest.first.name
13
+ assert_nil result.rest.rest.rest
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveLet < Test::Unit::TestCase
5
+ def test_evaluate_simple_body
6
+ let = AjLisp::FPrimitiveLet.instance
7
+ list = AjLisp::List.make [let, [[:a, 1], [:b, 2]], [:cons, :a, [:cons, :b]] ]
8
+
9
+ result = let.evaluate(AjLisp::context, list)
10
+
11
+ assert_not_nil result
12
+ assert result.is_a? AjLisp::List
13
+ assert_equal 1, result.first
14
+ assert_equal 2, result.rest.first
15
+ assert_nil result.rest.rest
16
+ end
17
+ end
18
+
@@ -0,0 +1,17 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ class TestFPrimitiveMacroClosure < Test::Unit::TestCase
5
+ def test_evaluate_simple_body
6
+ arguments = AjLisp::List.make [ :a, :b ]
7
+ body = [ AjLisp::List.make([ :list, :a, :b ])]
8
+ mclosure = AjLisp::FPrimitiveMacroClosure.new arguments, body
9
+ list = AjLisp::List.make [mclosure, :first, [:quote, [:b, :c]]]
10
+
11
+ result = mclosure.evaluate(AjLisp::context, list)
12
+
13
+ assert_not_nil result
14
+ assert result.is_a? AjLisp::NamedAtom
15
+ assert_equal :b, result.name
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+
2
+ require 'ajlisp'
3
+ require 'test/unit'
4
+
5
+ class TestFPrimitiveMLambda < Test::Unit::TestCase
6
+ def test_evaluate
7
+ list = AjLisp::List.make [[:mlambda, [:a, :b], [:list, :a, :b]], :first, [:quote, [:b, :c]]]
8
+ result = list.evaluate AjLisp::context
9
+ assert result.is_a? AjLisp::NamedAtom
10
+ assert_equal :b, result.name
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+
2
+ require 'ajlisp'
3
+ require 'test/unit'
4
+
5
+ module AjLisp
6
+
7
+ class TestFPrimitiveQuote < Test::Unit::TestCase
8
+ def test_simple_apply
9
+ list = List.new("a")
10
+ quote = FPrimitiveQuote.instance
11
+ result = quote.apply(nil, [list])
12
+ assert result.is_a? List
13
+ assert_equal "a", result.first
14
+ assert_nil result.rest
15
+ end
16
+
17
+ def test_simple_evaluate_with_atom
18
+ form = List.make [:quote, :a]
19
+ result = form.evaluate(AjLisp::context)
20
+ assert_not_nil result
21
+ assert_equal :a, result.name
22
+ end
23
+
24
+ def test_simple_evaluate_with_list
25
+ form = List.make [:quote, [:a, :b]]
26
+ result = form.evaluate(AjLisp::context)
27
+ assert_not_nil result
28
+ assert result.is_a? List
29
+ assert_equal :a, result.first.name
30
+ assert_equal :b, result.rest.first.name
31
+ assert_nil result.rest.rest
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,208 @@
1
+ require 'ajlisp'
2
+ require 'test/unit'
3
+
4
+ module AjLisp
5
+
6
+ class TestLexer < Test::Unit::TestCase
7
+ def test_get_atom_token
8
+ source = StringSource.new "atom"
9
+ lexer = Lexer.new source
10
+ token = lexer.nextToken
11
+
12
+ assert_not_nil token
13
+ assert_equal "atom", token.value
14
+ assert_equal TokenType::ATOM, token.type
15
+ assert_nil lexer.nextToken
16
+ end
17
+
18
+ def test_get_atom_token_with_spaces
19
+ source = StringSource.new " atom "
20
+ lexer = Lexer.new source
21
+ token = lexer.nextToken
22
+
23
+ assert_not_nil token
24
+ assert_equal "atom", token.value
25
+ assert_equal TokenType::ATOM, token.type
26
+ assert_nil lexer.nextToken
27
+ end
28
+
29
+ def test_get_two_atoms
30
+ source = StringSource.new "foo bar"
31
+ lexer = Lexer.new source
32
+ token = lexer.nextToken
33
+
34
+ assert_not_nil token
35
+ assert_equal "foo", token.value
36
+ assert_equal TokenType::ATOM, token.type
37
+
38
+ token = lexer.nextToken
39
+
40
+ assert_not_nil token
41
+ assert_equal "bar", token.value
42
+ assert_equal TokenType::ATOM, token.type
43
+
44
+ assert_nil lexer.nextToken
45
+ end
46
+
47
+ def test_get_parentheses
48
+ source = StringSource.new "()"
49
+ lexer = Lexer.new source
50
+ token = lexer.nextToken
51
+
52
+ assert_not_nil token
53
+ assert_equal "(", token.value
54
+ assert_equal TokenType::SEPARATOR, token.type
55
+
56
+ token = lexer.nextToken
57
+
58
+ assert_not_nil token
59
+ assert_equal ")", token.value
60
+ assert_equal TokenType::SEPARATOR, token.type
61
+
62
+ assert_nil lexer.nextToken
63
+ end
64
+
65
+ def test_get_integer
66
+ source = StringSource.new "123"
67
+ lexer = Lexer.new source
68
+ token = lexer.nextToken
69
+
70
+ assert_not_nil token
71
+ assert_equal "123", token.value
72
+ assert_equal TokenType::INTEGER, token.type
73
+ assert_nil lexer.nextToken
74
+ end
75
+
76
+ def test_get_add
77
+ source = StringSource.new "+"
78
+ lexer = Lexer.new source
79
+ token = lexer.nextToken
80
+
81
+ assert_not_nil token
82
+ assert_equal "+", token.value
83
+ assert_equal TokenType::ATOM, token.type
84
+ assert_nil lexer.nextToken
85
+ end
86
+
87
+ def test_get_less_equal
88
+ source = StringSource.new "<="
89
+ lexer = Lexer.new source
90
+ token = lexer.nextToken
91
+
92
+ assert_not_nil token
93
+ assert_equal "<=", token.value
94
+ assert_equal TokenType::ATOM, token.type
95
+ assert_nil lexer.nextToken
96
+ end
97
+
98
+ def test_get_quote_and_atom
99
+ source = StringSource.new "'a"
100
+ lexer = Lexer.new source
101
+ token = lexer.nextToken
102
+
103
+ assert_not_nil token
104
+ assert_equal "'", token.value
105
+ assert_equal TokenType::ATOM, token.type
106
+
107
+ token = lexer.nextToken
108
+
109
+ assert_not_nil token
110
+ assert_equal "a", token.value
111
+ assert_equal TokenType::ATOM, token.type
112
+
113
+ assert_nil lexer.nextToken
114
+ end
115
+
116
+ def test_get_backquote_and_atom
117
+ source = StringSource.new "`a"
118
+ lexer = Lexer.new source
119
+ token = lexer.nextToken
120
+
121
+ assert_not_nil token
122
+ assert_equal "`", token.value
123
+ assert_equal TokenType::ATOM, token.type
124
+
125
+ token = lexer.nextToken
126
+
127
+ assert_not_nil token
128
+ assert_equal "a", token.value
129
+ assert_equal TokenType::ATOM, token.type
130
+
131
+ assert_nil lexer.nextToken
132
+ end
133
+
134
+ def test_get_unquote_and_atom
135
+ source = StringSource.new ",a"
136
+ lexer = Lexer.new source
137
+ token = lexer.nextToken
138
+
139
+ assert_not_nil token
140
+ assert_equal ",", token.value
141
+ assert_equal TokenType::ATOM, token.type
142
+
143
+ token = lexer.nextToken
144
+
145
+ assert_not_nil token
146
+ assert_equal "a", token.value
147
+ assert_equal TokenType::ATOM, token.type
148
+
149
+ assert_nil lexer.nextToken
150
+ end
151
+
152
+ def test_get_string
153
+ source = StringSource.new '"foo"'
154
+ lexer = Lexer.new source
155
+ token = lexer.nextToken
156
+
157
+ assert_not_nil token
158
+ assert_equal "foo", token.value
159
+ assert_equal TokenType::STRING, token.type
160
+ assert_nil lexer.nextToken
161
+ end
162
+
163
+ def test_get_verb_atom_token
164
+ source = StringSource.new ".verb"
165
+ lexer = Lexer.new source
166
+ token = lexer.nextToken
167
+
168
+ assert_not_nil token
169
+ assert_equal ".verb", token.value
170
+ assert_equal TokenType::ATOM, token.type
171
+ assert_nil lexer.nextToken
172
+ end
173
+
174
+ def test_get_verb_atom_token_with_question_mark
175
+ source = StringSource.new ".include?"
176
+ lexer = Lexer.new source
177
+ token = lexer.nextToken
178
+
179
+ assert_not_nil token
180
+ assert_equal ".include?", token.value
181
+ assert_equal TokenType::ATOM, token.type
182
+ assert_nil lexer.nextToken
183
+ end
184
+
185
+ def test_get_predicate_atom
186
+ source = StringSource.new "nil?"
187
+ lexer = Lexer.new source
188
+ token = lexer.nextToken
189
+
190
+ assert_not_nil token
191
+ assert_equal "nil?", token.value
192
+ assert_equal TokenType::ATOM, token.type
193
+ assert_nil lexer.nextToken
194
+ end
195
+
196
+ def test_get_constant_atom_token
197
+ source = StringSource.new "@String"
198
+ lexer = Lexer.new source
199
+ token = lexer.nextToken
200
+
201
+ assert_not_nil token
202
+ assert_equal "@String", token.value
203
+ assert_equal TokenType::ATOM, token.type
204
+ assert_nil lexer.nextToken
205
+ end
206
+ end
207
+
208
+ end