Class: Liquid::Lexer
- Inherits:
-
Object
- Object
- Liquid::Lexer
- Defined in:
- lib/liquid/lexer.rb
Constant Summary collapse
- SPECIALS =
{ '|'.freeze => :pipe, '.'.freeze => :dot, ':'.freeze => :colon, ','.freeze => :comma, '['.freeze => :open_square, ']'.freeze => :close_square, '('.freeze => :open_round, ')'.freeze => :close_round, '?'.freeze => :question, '-'.freeze => :dash }.freeze
- IDENTIFIER =
/[a-zA-Z_][\w-]*\??/
- SINGLE_STRING_LITERAL =
/'[^\']*'/
- DOUBLE_STRING_LITERAL =
/"[^\"]*"/
- NUMBER_LITERAL =
/-?\d+(\.\d+)?/
- DOTDOT =
/\.\./
- COMPARISON_OPERATOR =
/==|!=|<>|<=?|>=?|contains(?=\s)/
- WHITESPACE_OR_NOTHING =
/\s*/
Instance Method Summary collapse
-
#initialize(input) ⇒ Lexer
constructor
A new instance of Lexer.
- #tokenize ⇒ Object
Constructor Details
#initialize(input) ⇒ Lexer
Returns a new instance of Lexer.
24 25 26 |
# File 'lib/liquid/lexer.rb', line 24 def initialize(input) @ss = StringScanner.new(input) end |
Instance Method Details
#tokenize ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/liquid/lexer.rb', line 28 def tokenize @output = [] until @ss.eos? @ss.skip(WHITESPACE_OR_NOTHING) break if @ss.eos? tok = case when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t] when t = @ss.scan(SINGLE_STRING_LITERAL) then [:string, t] when t = @ss.scan(DOUBLE_STRING_LITERAL) then [:string, t] when t = @ss.scan(NUMBER_LITERAL) then [:number, t] when t = @ss.scan(IDENTIFIER) then [:id, t] when t = @ss.scan(DOTDOT) then [:dotdot, t] else c = @ss.getch if s = SPECIALS[c] [s, c] else raise SyntaxError, "Unexpected character #{c}" end end @output << tok end @output << [:end_of_string] end |