hotcell 0.0.1

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 (50) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +15 -0
  5. data/Guardfile +24 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +17 -0
  9. data/hotcell.gemspec +22 -0
  10. data/lib/hotcell/.DS_Store +0 -0
  11. data/lib/hotcell/config.rb +31 -0
  12. data/lib/hotcell/context.rb +36 -0
  13. data/lib/hotcell/errors.rb +43 -0
  14. data/lib/hotcell/extensions.rb +42 -0
  15. data/lib/hotcell/lexer.rb +783 -0
  16. data/lib/hotcell/lexer.rl +299 -0
  17. data/lib/hotcell/manipulator.rb +31 -0
  18. data/lib/hotcell/node/arrayer.rb +7 -0
  19. data/lib/hotcell/node/assigner.rb +11 -0
  20. data/lib/hotcell/node/block.rb +58 -0
  21. data/lib/hotcell/node/calculator.rb +35 -0
  22. data/lib/hotcell/node/command.rb +41 -0
  23. data/lib/hotcell/node/hasher.rb +7 -0
  24. data/lib/hotcell/node/joiner.rb +7 -0
  25. data/lib/hotcell/node/sequencer.rb +7 -0
  26. data/lib/hotcell/node/summoner.rb +11 -0
  27. data/lib/hotcell/node/tag.rb +26 -0
  28. data/lib/hotcell/node.rb +55 -0
  29. data/lib/hotcell/parser.rb +1186 -0
  30. data/lib/hotcell/parser.y +231 -0
  31. data/lib/hotcell/scope.rb +57 -0
  32. data/lib/hotcell/template.rb +29 -0
  33. data/lib/hotcell/version.rb +3 -0
  34. data/lib/hotcell.rb +19 -0
  35. data/misc/rage.rl +1999 -0
  36. data/misc/unicode2ragel.rb +305 -0
  37. data/spec/data/dstrings +8 -0
  38. data/spec/data/sstrings +6 -0
  39. data/spec/lib/hotcell/config_spec.rb +57 -0
  40. data/spec/lib/hotcell/context_spec.rb +53 -0
  41. data/spec/lib/hotcell/lexer_spec.rb +340 -0
  42. data/spec/lib/hotcell/manipulator_spec.rb +64 -0
  43. data/spec/lib/hotcell/node/block_spec.rb +188 -0
  44. data/spec/lib/hotcell/node/command_spec.rb +71 -0
  45. data/spec/lib/hotcell/parser_spec.rb +382 -0
  46. data/spec/lib/hotcell/scope_spec.rb +160 -0
  47. data/spec/lib/hotcell/template_spec.rb +41 -0
  48. data/spec/lib/hotcell_spec.rb +8 -0
  49. data/spec/spec_helper.rb +44 -0
  50. metadata +139 -0
@@ -0,0 +1,783 @@
1
+
2
+ # line 1 "lib/hotcell/lexer.rl"
3
+
4
+ # line 97 "lib/hotcell/lexer.rl"
5
+
6
+ #%
7
+
8
+ module Hotcell
9
+ class Lexer
10
+ OPERATIONS = {
11
+ '+' => :PLUS, '-' => :MINUS, '*' => :MULTIPLY, '**' => :POWER, '/' => :DIVIDE, '%' => :MODULO,
12
+
13
+ '&&' => :AND, '||' => :OR, '!' => :NOT, '==' => :EQUAL, '!=' => :INEQUAL,
14
+ '>' => :GT, '>=' => :GTE, '<' => :LT, '<=' => :LTE,
15
+
16
+ '=' => :ASSIGN, ',' => :COMMA, '.' => :PERIOD, ':' => :COLON, '?' => :QUESTION,
17
+ ';' => :SEMICOLON
18
+ }
19
+
20
+ BOPEN = { '[' => :AOPEN, '{' => :HOPEN, '(' => :POPEN }
21
+ BCLOSE = { ']' => :ACLOSE, '}' => :HCLOSE, ')' => :PCLOSE }
22
+ BRACKETS = BOPEN.merge(BCLOSE)
23
+
24
+ OPERATORS = OPERATIONS.merge(BRACKETS).merge("\n" => :NEWLINE)
25
+
26
+ CONSTANTS = {
27
+ 'nil' => [:NIL, nil], 'null' => [:NIL, nil],
28
+ 'false' => [:FALSE, false], 'true' => [:TRUE, true]
29
+ }
30
+
31
+ SSTRING_ESCAPE_REGEXP = /\\\'|\\\\/
32
+ SSTRING_ESCAPE_MAP = { "\\'" => "'", "\\\\" => "\\" }
33
+
34
+ DSTRING_ESCAPE_REGEXP = /\\./
35
+ DSTRING_ESCAPE_MAP = {
36
+ '\\"' => '"', "\\\\" => "\\", '\n' => "\n",
37
+ '\s' => "\s", '\r' => "\r", '\t' => "\t"
38
+ }
39
+
40
+ TAGS = {
41
+ '{{' => :TOPEN, '{{!' => :TOPEN,
42
+ '}}' => :TCLOSE
43
+ }
44
+
45
+ PREREGEXP = Set.new [
46
+ :TOPEN, :NEWLINE, :SEMICOLON,
47
+ :COLON, :COMMA, :PERIOD,
48
+ :POPEN, :AOPEN, :HOPEN
49
+ ]
50
+
51
+ def initialize source
52
+ @source = source
53
+ @data = @source.unpack 'c*'
54
+
55
+
56
+ # line 57 "lib/hotcell/lexer.rb"
57
+ class << self
58
+ attr_accessor :_puffer_lexer_actions
59
+ private :_puffer_lexer_actions, :_puffer_lexer_actions=
60
+ end
61
+ self._puffer_lexer_actions = [
62
+ 0, 1, 0, 1, 1, 1, 3, 1,
63
+ 4, 1, 5, 1, 8, 1, 9, 1,
64
+ 10, 1, 11, 1, 12, 1, 13, 1,
65
+ 14, 1, 15, 1, 16, 1, 17, 1,
66
+ 18, 1, 19, 1, 20, 1, 21, 1,
67
+ 22, 1, 23, 1, 24, 1, 25, 1,
68
+ 26, 1, 27, 1, 28, 2, 5, 2,
69
+ 2, 5, 6, 2, 5, 7
70
+ ]
71
+
72
+ class << self
73
+ attr_accessor :_puffer_lexer_key_offsets
74
+ private :_puffer_lexer_key_offsets, :_puffer_lexer_key_offsets=
75
+ end
76
+ self._puffer_lexer_key_offsets = [
77
+ 0, 0, 2, 2, 3, 4, 6, 6,
78
+ 8, 8, 10, 11, 12, 13, 14, 15,
79
+ 17, 48, 49, 51, 52, 54, 56, 60,
80
+ 63, 72, 73, 74, 75
81
+ ]
82
+
83
+ class << self
84
+ attr_accessor :_puffer_lexer_trans_keys
85
+ private :_puffer_lexer_trans_keys, :_puffer_lexer_trans_keys=
86
+ end
87
+ self._puffer_lexer_trans_keys = [
88
+ 34, 92, 125, 38, 39, 92, 47, 92,
89
+ 48, 57, 124, 125, 123, 123, 123, 33,
90
+ 35, 10, 32, 33, 34, 35, 38, 39,
91
+ 42, 46, 47, 63, 91, 93, 95, 123,
92
+ 124, 125, 9, 13, 37, 45, 48, 57,
93
+ 58, 59, 60, 62, 65, 90, 97, 122,
94
+ 61, 10, 125, 42, 48, 57, 47, 92,
95
+ 65, 90, 97, 122, 46, 48, 57, 33,
96
+ 63, 95, 48, 57, 65, 90, 97, 122,
97
+ 125, 35, 35, 125, 0
98
+ ]
99
+
100
+ class << self
101
+ attr_accessor :_puffer_lexer_single_lengths
102
+ private :_puffer_lexer_single_lengths, :_puffer_lexer_single_lengths=
103
+ end
104
+ self._puffer_lexer_single_lengths = [
105
+ 0, 2, 0, 1, 1, 2, 0, 2,
106
+ 0, 0, 1, 1, 1, 1, 1, 2,
107
+ 17, 1, 2, 1, 0, 2, 0, 1,
108
+ 3, 1, 1, 1, 1
109
+ ]
110
+
111
+ class << self
112
+ attr_accessor :_puffer_lexer_range_lengths
113
+ private :_puffer_lexer_range_lengths, :_puffer_lexer_range_lengths=
114
+ end
115
+ self._puffer_lexer_range_lengths = [
116
+ 0, 0, 0, 0, 0, 0, 0, 0,
117
+ 0, 1, 0, 0, 0, 0, 0, 0,
118
+ 7, 0, 0, 0, 1, 0, 2, 1,
119
+ 3, 0, 0, 0, 0
120
+ ]
121
+
122
+ class << self
123
+ attr_accessor :_puffer_lexer_index_offsets
124
+ private :_puffer_lexer_index_offsets, :_puffer_lexer_index_offsets=
125
+ end
126
+ self._puffer_lexer_index_offsets = [
127
+ 0, 0, 3, 4, 6, 8, 11, 12,
128
+ 15, 16, 18, 20, 22, 24, 26, 28,
129
+ 31, 56, 58, 61, 63, 65, 68, 71,
130
+ 74, 81, 83, 85, 87
131
+ ]
132
+
133
+ class << self
134
+ attr_accessor :_puffer_lexer_trans_targs
135
+ private :_puffer_lexer_trans_targs, :_puffer_lexer_trans_targs=
136
+ end
137
+ self._puffer_lexer_trans_targs = [
138
+ 16, 2, 1, 1, 16, 18, 16, 0,
139
+ 16, 6, 5, 5, 22, 8, 7, 7,
140
+ 20, 16, 16, 0, 26, 26, 14, 13,
141
+ 12, 13, 15, 12, 12, 12, 12, 16,
142
+ 16, 17, 1, 18, 4, 5, 19, 20,
143
+ 21, 16, 16, 16, 24, 16, 10, 25,
144
+ 16, 16, 23, 16, 17, 24, 24, 0,
145
+ 16, 16, 16, 3, 18, 16, 16, 20,
146
+ 16, 22, 8, 7, 22, 22, 16, 9,
147
+ 23, 16, 16, 16, 24, 24, 24, 24,
148
+ 16, 16, 16, 28, 27, 26, 27, 11,
149
+ 26, 16, 16, 16, 16, 26, 12, 12,
150
+ 12, 16, 16, 16, 16, 16, 16, 16,
151
+ 16, 16, 26, 26, 0
152
+ ]
153
+
154
+ class << self
155
+ attr_accessor :_puffer_lexer_trans_actions
156
+ private :_puffer_lexer_trans_actions, :_puffer_lexer_trans_actions=
157
+ end
158
+ self._puffer_lexer_trans_actions = [
159
+ 19, 0, 0, 0, 37, 9, 13, 0,
160
+ 17, 0, 0, 0, 0, 0, 0, 0,
161
+ 59, 35, 13, 0, 41, 45, 0, 0,
162
+ 51, 0, 0, 51, 47, 47, 49, 13,
163
+ 21, 0, 0, 9, 0, 0, 0, 56,
164
+ 53, 13, 13, 13, 0, 13, 0, 0,
165
+ 21, 13, 9, 13, 0, 0, 0, 0,
166
+ 13, 23, 31, 0, 9, 13, 23, 59,
167
+ 39, 0, 0, 0, 0, 0, 29, 0,
168
+ 9, 25, 15, 15, 0, 0, 0, 0,
169
+ 27, 11, 23, 9, 0, 43, 0, 0,
170
+ 43, 37, 33, 33, 35, 45, 51, 51,
171
+ 49, 23, 31, 23, 39, 23, 29, 25,
172
+ 27, 23, 43, 43, 0
173
+ ]
174
+
175
+ class << self
176
+ attr_accessor :_puffer_lexer_to_state_actions
177
+ private :_puffer_lexer_to_state_actions, :_puffer_lexer_to_state_actions=
178
+ end
179
+ self._puffer_lexer_to_state_actions = [
180
+ 0, 0, 0, 0, 0, 0, 0, 0,
181
+ 0, 0, 0, 0, 5, 0, 0, 0,
182
+ 5, 0, 0, 0, 0, 0, 0, 0,
183
+ 0, 0, 5, 0, 0
184
+ ]
185
+
186
+ class << self
187
+ attr_accessor :_puffer_lexer_from_state_actions
188
+ private :_puffer_lexer_from_state_actions, :_puffer_lexer_from_state_actions=
189
+ end
190
+ self._puffer_lexer_from_state_actions = [
191
+ 0, 0, 0, 0, 0, 0, 0, 0,
192
+ 0, 0, 0, 0, 7, 0, 0, 0,
193
+ 7, 0, 0, 0, 0, 0, 0, 0,
194
+ 0, 0, 7, 0, 0
195
+ ]
196
+
197
+ class << self
198
+ attr_accessor :_puffer_lexer_eof_actions
199
+ private :_puffer_lexer_eof_actions, :_puffer_lexer_eof_actions=
200
+ end
201
+ self._puffer_lexer_eof_actions = [
202
+ 0, 3, 0, 0, 0, 1, 0, 0,
203
+ 0, 0, 0, 0, 0, 0, 0, 0,
204
+ 0, 0, 0, 0, 0, 0, 0, 0,
205
+ 0, 0, 0, 0, 0
206
+ ]
207
+
208
+ class << self
209
+ attr_accessor :_puffer_lexer_eof_trans
210
+ private :_puffer_lexer_eof_trans, :_puffer_lexer_eof_trans=
211
+ end
212
+ self._puffer_lexer_eof_trans = [
213
+ 0, 0, 0, 90, 0, 0, 0, 92,
214
+ 92, 93, 0, 94, 0, 96, 96, 97,
215
+ 0, 106, 99, 106, 101, 106, 103, 104,
216
+ 105, 106, 0, 108, 108
217
+ ]
218
+
219
+ class << self
220
+ attr_accessor :puffer_lexer_start
221
+ end
222
+ self.puffer_lexer_start = 12;
223
+ class << self
224
+ attr_accessor :puffer_lexer_first_final
225
+ end
226
+ self.puffer_lexer_first_final = 12;
227
+ class << self
228
+ attr_accessor :puffer_lexer_error
229
+ end
230
+ self.puffer_lexer_error = 0;
231
+
232
+ class << self
233
+ attr_accessor :puffer_lexer_en_expression
234
+ end
235
+ self.puffer_lexer_en_expression = 16;
236
+ class << self
237
+ attr_accessor :puffer_lexer_en_template_comment
238
+ end
239
+ self.puffer_lexer_en_template_comment = 26;
240
+ class << self
241
+ attr_accessor :puffer_lexer_en_main
242
+ end
243
+ self.puffer_lexer_en_main = 12;
244
+
245
+
246
+ # line 148 "lib/hotcell/lexer.rl"
247
+ #%
248
+ end
249
+
250
+ def emit symbol, value
251
+ @token_array << [symbol, value]
252
+ end
253
+
254
+ def current_value
255
+ @data[@ts...@te].pack('c*').force_encoding('UTF-8')
256
+ end
257
+
258
+ def emit_operator
259
+ value = current_value
260
+ emit OPERATORS[value], value
261
+ end
262
+
263
+ def emit_numeric
264
+ # last = @token_array[-1]
265
+ # pre_last = @token_array[-2]
266
+ # # This need to give unary minus with numeric higher precedence then unari minus with
267
+ # last[0] = :NEGATIVE if last && last[0] == :MINUS &&
268
+ # (!pre_last || pre_last[0].in?())
269
+
270
+ value = current_value
271
+ if value =~ /\./
272
+ emit :FLOAT, Float(value)
273
+ else
274
+ emit :INTEGER, Integer(value)
275
+ end
276
+ end
277
+
278
+ def emit_identifer
279
+ value = current_value
280
+ if args = CONSTANTS[value]
281
+ emit *args
282
+ else
283
+ emit :IDENTIFER, value
284
+ end
285
+ end
286
+
287
+ def emit_sstring
288
+ emit :STRING, current_value[1..-2].gsub(SSTRING_ESCAPE_REGEXP) { |match|
289
+ SSTRING_ESCAPE_MAP[match] }.force_encoding('UTF-8')
290
+ end
291
+
292
+ def emit_dstring
293
+ emit :STRING, current_value[1..-2].gsub(DSTRING_ESCAPE_REGEXP) { |match|
294
+ DSTRING_ESCAPE_MAP[match] || match[1] }
295
+ end
296
+
297
+ def regexp_ambiguity
298
+ unless regexp_possible?
299
+ emit_operator
300
+ yield
301
+ end
302
+ end
303
+
304
+ def regexp_possible?
305
+ last = @token_array[-1]
306
+ # Need more rules!
307
+ !last || PREREGEXP.include?(last[0])
308
+ end
309
+
310
+ def emit_regexp
311
+ value = current_value
312
+ finish = value.rindex('/')
313
+
314
+ options_string = value[finish+1..-1]
315
+ options = 0
316
+ options |= Regexp::EXTENDED if options_string.include?('x')
317
+ options |= Regexp::IGNORECASE if options_string.include?('i')
318
+ options |= Regexp::MULTILINE if options_string.include?('m')
319
+
320
+ emit :REGEXP, Regexp.new(value[1..finish-1], options)
321
+ end
322
+
323
+ def emit_template
324
+ # Hack this to glue templates going straight
325
+ last = @token_array[-1]
326
+ if last && last[0] == :TEMPLATE
327
+ last[1] += current_value
328
+ else
329
+ emit :TEMPLATE, current_value
330
+ end
331
+ end
332
+
333
+ def emit_tag_or_comment if_tag, if_comment
334
+ value = current_value
335
+ if value == '{{#'
336
+ emit_comment
337
+ if_comment.call
338
+ else
339
+ emit_tag
340
+ if_tag.call
341
+ end
342
+ end
343
+
344
+ def emit_tag
345
+ value = current_value
346
+ emit TAGS[value], value
347
+ end
348
+
349
+ def emit_comment
350
+ last = @token_array[-1]
351
+ if last && last[0] == :COMMENT
352
+ last[1] += current_value
353
+ else
354
+ emit :COMMENT, current_value
355
+ end
356
+ end
357
+
358
+ def current_position
359
+ parsed = @data[0..@ts].pack('c*').force_encoding('UTF-8')
360
+ line = parsed.count("\n") + 1
361
+ column = parsed.size - 1 - (parsed.rindex("\n") || -1)
362
+ [line, column]
363
+ end
364
+
365
+ def raise_unexpected_symbol
366
+ raise Hotcell::Errors::UnexpectedSymbol.new *current_position
367
+ end
368
+
369
+ def raise_unterminated_string
370
+ raise Hotcell::Errors::UnterminatedString.new *current_position
371
+ end
372
+
373
+ def raise_unterminated_regexp
374
+ raise Hotcell::Errors::UnterminatedRegexp.new *current_position
375
+ end
376
+
377
+ def tokens
378
+ @tokens ||= tokenize
379
+ end
380
+
381
+ def tokenize
382
+ @token_array = []
383
+
384
+
385
+ # line 386 "lib/hotcell/lexer.rb"
386
+ begin
387
+ p ||= 0
388
+ pe ||= @data.length
389
+ cs = puffer_lexer_start
390
+ top = 0
391
+ @ts = nil
392
+ @te = nil
393
+ act = 0
394
+ end
395
+
396
+ # line 286 "lib/hotcell/lexer.rl"
397
+ #%
398
+
399
+ eof = pe
400
+ stack = []
401
+
402
+
403
+ # line 404 "lib/hotcell/lexer.rb"
404
+ begin
405
+ _klen, _trans, _keys, _acts, _nacts = nil
406
+ _goto_level = 0
407
+ _resume = 10
408
+ _eof_trans = 15
409
+ _again = 20
410
+ _test_eof = 30
411
+ _out = 40
412
+ while true
413
+ _trigger_goto = false
414
+ if _goto_level <= 0
415
+ if p == pe
416
+ _goto_level = _test_eof
417
+ next
418
+ end
419
+ if cs == 0
420
+ _goto_level = _out
421
+ next
422
+ end
423
+ end
424
+ if _goto_level <= _resume
425
+ _acts = _puffer_lexer_from_state_actions[cs]
426
+ _nacts = _puffer_lexer_actions[_acts]
427
+ _acts += 1
428
+ while _nacts > 0
429
+ _nacts -= 1
430
+ _acts += 1
431
+ case _puffer_lexer_actions[_acts - 1]
432
+ when 4 then
433
+ # line 1 "NONE"
434
+ begin
435
+ @ts = p
436
+ end
437
+ # line 438 "lib/hotcell/lexer.rb"
438
+ end # from state action switch
439
+ end
440
+ if _trigger_goto
441
+ next
442
+ end
443
+ _keys = _puffer_lexer_key_offsets[cs]
444
+ _trans = _puffer_lexer_index_offsets[cs]
445
+ _klen = _puffer_lexer_single_lengths[cs]
446
+ _break_match = false
447
+
448
+ begin
449
+ if _klen > 0
450
+ _lower = _keys
451
+ _upper = _keys + _klen - 1
452
+
453
+ loop do
454
+ break if _upper < _lower
455
+ _mid = _lower + ( (_upper - _lower) >> 1 )
456
+
457
+ if @data[p].ord < _puffer_lexer_trans_keys[_mid]
458
+ _upper = _mid - 1
459
+ elsif @data[p].ord > _puffer_lexer_trans_keys[_mid]
460
+ _lower = _mid + 1
461
+ else
462
+ _trans += (_mid - _keys)
463
+ _break_match = true
464
+ break
465
+ end
466
+ end # loop
467
+ break if _break_match
468
+ _keys += _klen
469
+ _trans += _klen
470
+ end
471
+ _klen = _puffer_lexer_range_lengths[cs]
472
+ if _klen > 0
473
+ _lower = _keys
474
+ _upper = _keys + (_klen << 1) - 2
475
+ loop do
476
+ break if _upper < _lower
477
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1)
478
+ if @data[p].ord < _puffer_lexer_trans_keys[_mid]
479
+ _upper = _mid - 2
480
+ elsif @data[p].ord > _puffer_lexer_trans_keys[_mid+1]
481
+ _lower = _mid + 2
482
+ else
483
+ _trans += ((_mid - _keys) >> 1)
484
+ _break_match = true
485
+ break
486
+ end
487
+ end # loop
488
+ break if _break_match
489
+ _trans += _klen
490
+ end
491
+ end while false
492
+ end
493
+ if _goto_level <= _eof_trans
494
+ cs = _puffer_lexer_trans_targs[_trans]
495
+ if _puffer_lexer_trans_actions[_trans] != 0
496
+ _acts = _puffer_lexer_trans_actions[_trans]
497
+ _nacts = _puffer_lexer_actions[_acts]
498
+ _acts += 1
499
+ while _nacts > 0
500
+ _nacts -= 1
501
+ _acts += 1
502
+ case _puffer_lexer_actions[_acts - 1]
503
+ when 2 then
504
+ # line 58 "lib/hotcell/lexer.rl"
505
+ begin
506
+ regexp_ambiguity { begin
507
+ cs = 16
508
+ _trigger_goto = true
509
+ _goto_level = _again
510
+ break
511
+ end
512
+ } end
513
+ when 5 then
514
+ # line 1 "NONE"
515
+ begin
516
+ @te = p+1
517
+ end
518
+ when 6 then
519
+ # line 78 "lib/hotcell/lexer.rl"
520
+ begin
521
+ act = 2; end
522
+ when 7 then
523
+ # line 79 "lib/hotcell/lexer.rl"
524
+ begin
525
+ act = 3; end
526
+ when 8 then
527
+ # line 77 "lib/hotcell/lexer.rl"
528
+ begin
529
+ @te = p+1
530
+ begin emit_tag; begin
531
+ top -= 1
532
+ cs = stack[top]
533
+ _trigger_goto = true
534
+ _goto_level = _again
535
+ break
536
+ end
537
+ end
538
+ end
539
+ when 9 then
540
+ # line 78 "lib/hotcell/lexer.rl"
541
+ begin
542
+ @te = p+1
543
+ begin emit_operator end
544
+ end
545
+ when 10 then
546
+ # line 80 "lib/hotcell/lexer.rl"
547
+ begin
548
+ @te = p+1
549
+ begin emit_identifer end
550
+ end
551
+ when 11 then
552
+ # line 81 "lib/hotcell/lexer.rl"
553
+ begin
554
+ @te = p+1
555
+ begin emit_sstring end
556
+ end
557
+ when 12 then
558
+ # line 82 "lib/hotcell/lexer.rl"
559
+ begin
560
+ @te = p+1
561
+ begin emit_dstring end
562
+ end
563
+ when 13 then
564
+ # line 85 "lib/hotcell/lexer.rl"
565
+ begin
566
+ @te = p+1
567
+ end
568
+ when 14 then
569
+ # line 78 "lib/hotcell/lexer.rl"
570
+ begin
571
+ @te = p
572
+ p = p - 1; begin emit_operator end
573
+ end
574
+ when 15 then
575
+ # line 79 "lib/hotcell/lexer.rl"
576
+ begin
577
+ @te = p
578
+ p = p - 1; begin emit_numeric end
579
+ end
580
+ when 16 then
581
+ # line 80 "lib/hotcell/lexer.rl"
582
+ begin
583
+ @te = p
584
+ p = p - 1; begin emit_identifer end
585
+ end
586
+ when 17 then
587
+ # line 83 "lib/hotcell/lexer.rl"
588
+ begin
589
+ @te = p
590
+ p = p - 1; begin emit_regexp end
591
+ end
592
+ when 18 then
593
+ # line 84 "lib/hotcell/lexer.rl"
594
+ begin
595
+ @te = p
596
+ p = p - 1; begin emit_comment end
597
+ end
598
+ when 19 then
599
+ # line 78 "lib/hotcell/lexer.rl"
600
+ begin
601
+ begin p = (( @te))-1; end
602
+ begin emit_operator end
603
+ end
604
+ when 20 then
605
+ # line 79 "lib/hotcell/lexer.rl"
606
+ begin
607
+ begin p = (( @te))-1; end
608
+ begin emit_numeric end
609
+ end
610
+ when 21 then
611
+ # line 84 "lib/hotcell/lexer.rl"
612
+ begin
613
+ begin p = (( @te))-1; end
614
+ begin emit_comment end
615
+ end
616
+ when 22 then
617
+ # line 1 "NONE"
618
+ begin
619
+ case act
620
+ when 2 then
621
+ begin begin p = (( @te))-1; end
622
+ emit_operator end
623
+ when 3 then
624
+ begin begin p = (( @te))-1; end
625
+ emit_numeric end
626
+ end
627
+ end
628
+ when 23 then
629
+ # line 89 "lib/hotcell/lexer.rl"
630
+ begin
631
+ @te = p+1
632
+ begin emit_comment; begin
633
+ top -= 1
634
+ cs = stack[top]
635
+ _trigger_goto = true
636
+ _goto_level = _again
637
+ break
638
+ end
639
+ end
640
+ end
641
+ when 24 then
642
+ # line 90 "lib/hotcell/lexer.rl"
643
+ begin
644
+ @te = p
645
+ p = p - 1; begin emit_comment end
646
+ end
647
+ when 25 then
648
+ # line 90 "lib/hotcell/lexer.rl"
649
+ begin
650
+ begin p = (( @te))-1; end
651
+ begin emit_comment end
652
+ end
653
+ when 26 then
654
+ # line 94 "lib/hotcell/lexer.rl"
655
+ begin
656
+ @te = p+1
657
+ begin emit_tag_or_comment ->{ begin
658
+ stack[top] = cs
659
+ top+= 1
660
+ cs = 16
661
+ _trigger_goto = true
662
+ _goto_level = _again
663
+ break
664
+ end
665
+ }, ->{ begin
666
+ stack[top] = cs
667
+ top+= 1
668
+ cs = 26
669
+ _trigger_goto = true
670
+ _goto_level = _again
671
+ break
672
+ end
673
+ } end
674
+ end
675
+ when 27 then
676
+ # line 94 "lib/hotcell/lexer.rl"
677
+ begin
678
+ @te = p
679
+ p = p - 1; begin emit_tag_or_comment ->{ begin
680
+ stack[top] = cs
681
+ top+= 1
682
+ cs = 16
683
+ _trigger_goto = true
684
+ _goto_level = _again
685
+ break
686
+ end
687
+ }, ->{ begin
688
+ stack[top] = cs
689
+ top+= 1
690
+ cs = 26
691
+ _trigger_goto = true
692
+ _goto_level = _again
693
+ break
694
+ end
695
+ } end
696
+ end
697
+ when 28 then
698
+ # line 95 "lib/hotcell/lexer.rl"
699
+ begin
700
+ @te = p
701
+ p = p - 1; begin emit_template end
702
+ end
703
+ # line 704 "lib/hotcell/lexer.rb"
704
+ end # action switch
705
+ end
706
+ end
707
+ if _trigger_goto
708
+ next
709
+ end
710
+ end
711
+ if _goto_level <= _again
712
+ _acts = _puffer_lexer_to_state_actions[cs]
713
+ _nacts = _puffer_lexer_actions[_acts]
714
+ _acts += 1
715
+ while _nacts > 0
716
+ _nacts -= 1
717
+ _acts += 1
718
+ case _puffer_lexer_actions[_acts - 1]
719
+ when 3 then
720
+ # line 1 "NONE"
721
+ begin
722
+ @ts = nil; end
723
+ # line 724 "lib/hotcell/lexer.rb"
724
+ end # to state action switch
725
+ end
726
+ if _trigger_goto
727
+ next
728
+ end
729
+ if cs == 0
730
+ _goto_level = _out
731
+ next
732
+ end
733
+ p += 1
734
+ if p != pe
735
+ _goto_level = _resume
736
+ next
737
+ end
738
+ end
739
+ if _goto_level <= _test_eof
740
+ if p == eof
741
+ if _puffer_lexer_eof_trans[cs] > 0
742
+ _trans = _puffer_lexer_eof_trans[cs] - 1;
743
+ _goto_level = _eof_trans
744
+ next;
745
+ end
746
+ __acts = _puffer_lexer_eof_actions[cs]
747
+ __nacts = _puffer_lexer_actions[__acts]
748
+ __acts += 1
749
+ while __nacts > 0
750
+ __nacts -= 1
751
+ __acts += 1
752
+ case _puffer_lexer_actions[__acts - 1]
753
+ when 0 then
754
+ # line 50 "lib/hotcell/lexer.rl"
755
+ begin
756
+ raise_unterminated_string end
757
+ when 1 then
758
+ # line 54 "lib/hotcell/lexer.rl"
759
+ begin
760
+ raise_unterminated_string end
761
+ # line 762 "lib/hotcell/lexer.rb"
762
+ end # eof action switch
763
+ end
764
+ if _trigger_goto
765
+ next
766
+ end
767
+ end
768
+ end
769
+ if _goto_level <= _out
770
+ break
771
+ end
772
+ end
773
+ end
774
+
775
+ # line 292 "lib/hotcell/lexer.rl"
776
+ #%
777
+
778
+ raise_unexpected_symbol unless @ts.nil?
779
+
780
+ @token_array
781
+ end
782
+ end
783
+ end