Browse Source

Make hashes their own token type

master
Dylan Baker 5 years ago
parent
commit
8da2f2da25
4 changed files with 14 additions and 6 deletions
  1. 0
    1
      lib/ahem/ast/operators.rb
  2. 3
    3
      lib/ahem/lexer.rb
  3. 1
    0
      lib/ahem/token_kinds.rb
  4. 10
    2
      spec/lexer_spec.rb

+ 0
- 1
lib/ahem/ast/operators.rb View File

11
   OR = :or
11
   OR = :or
12
   AND = :and
12
   AND = :and
13
   NOT = :not
13
   NOT = :not
14
-  HASH = :'#'
15
 end
14
 end

+ 3
- 3
lib/ahem/lexer.rb View File

110
     elsif source.match(/\A=>/)
110
     elsif source.match(/\A=>/)
111
       @position += 2
111
       @position += 2
112
       Token.new(TokenKinds::ROCKET)
112
       Token.new(TokenKinds::ROCKET)
113
+    elsif source.match(/\A\#/)
114
+      @position += 1
115
+      Token.new(TokenKinds::HASH)      
113
     elsif source.match(/\A!/)
116
     elsif source.match(/\A!/)
114
       @position += 1
117
       @position += 1
115
       Token.new(TokenKinds::OPERATOR, :!)
118
       Token.new(TokenKinds::OPERATOR, :!)
128
     elsif source.match(/\A\>/)
131
     elsif source.match(/\A\>/)
129
       @position += 1
132
       @position += 1
130
       Token.new(TokenKinds::OPERATOR, :>)
133
       Token.new(TokenKinds::OPERATOR, :>)
131
-    elsif source.match(/\A\#/)
132
-      @position += 1
133
-      Token.new(TokenKinds::OPERATOR, :'#')
134
     elsif source.match(/\Aand/)
134
     elsif source.match(/\Aand/)
135
       @position += 3
135
       @position += 3
136
       Token.new(TokenKinds::OPERATOR, :and)
136
       Token.new(TokenKinds::OPERATOR, :and)

+ 1
- 0
lib/ahem/token_kinds.rb View File

11
   EQUALS = :equals
11
   EQUALS = :equals
12
   FOR = :for
12
   FOR = :for
13
   FUNCTION = :function
13
   FUNCTION = :function
14
+  HASH = :hash
14
   IDENTIFIER = :identifier
15
   IDENTIFIER = :identifier
15
   IF = :if
16
   IF = :if
16
   IN = :in
17
   IN = :in

+ 10
- 2
spec/lexer_spec.rb View File

32
   end
32
   end
33
 
33
 
34
   it 'lexes operators' do
34
   it 'lexes operators' do
35
-    expect(Lexer.new('+-*/<<=>>===# and or not').scan_all).to eq(
35
+    expect(Lexer.new('+-*/<<=>>=== and or not').scan_all).to eq(
36
       [
36
       [
37
         Token.new(TokenKinds::OPERATOR, :+),
37
         Token.new(TokenKinds::OPERATOR, :+),
38
         Token.new(TokenKinds::OPERATOR, :-),
38
         Token.new(TokenKinds::OPERATOR, :-),
43
         Token.new(TokenKinds::OPERATOR, :>),
43
         Token.new(TokenKinds::OPERATOR, :>),
44
         Token.new(TokenKinds::OPERATOR, :>=),
44
         Token.new(TokenKinds::OPERATOR, :>=),
45
         Token.new(TokenKinds::OPERATOR, :==),
45
         Token.new(TokenKinds::OPERATOR, :==),
46
-        Token.new(TokenKinds::OPERATOR, :'#'),
47
         Token.new(TokenKinds::OPERATOR, :and),
46
         Token.new(TokenKinds::OPERATOR, :and),
48
         Token.new(TokenKinds::OPERATOR, :or),
47
         Token.new(TokenKinds::OPERATOR, :or),
49
         Token.new(TokenKinds::OPERATOR, :not),
48
         Token.new(TokenKinds::OPERATOR, :not),
179
       ]
178
       ]
180
     )
179
     )
181
   end
180
   end
181
+
182
+  it 'lexes hashes' do
183
+    expect(Lexer.new("#").scan_all).to eq(
184
+      [
185
+        Token.new(TokenKinds::HASH),
186
+        Token.new(TokenKinds::EOF)
187
+      ]
188
+    )
189
+  end
182
 end
190
 end

Loading…
Cancel
Save