Sha256: 8adfe038102e8e86511daf330c028445c0b4f80c5308e839529885643db6dc38
Contents?: true
Size: 1.38 KB
Versions: 4
Compression:
Stored size: 1.38 KB
Contents
require "strscan" module Liquid class Lexer 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 } IDENTIFIER = /[a-zA-Z_][\w-]*\??/ SINGLE_STRING_LITERAL = /'[^\']*'/ DOUBLE_STRING_LITERAL = /"[^\"]*"/ NUMBER_LITERAL = /-?\d+(\.\d+)?/ DOTDOT = /\.\./ COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains/ def initialize(input) @ss = StringScanner.new(input.rstrip) end def tokenize @output = [] until @ss.eos? @ss.skip(/\s*/) 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 end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
liquid-4.0.0 | lib/liquid/lexer.rb |
liquid-4.0.0.rc3 | lib/liquid/lexer.rb |
liquid-4.0.0.rc2 | lib/liquid/lexer.rb |
liquid-4.0.0.rc1 | lib/liquid/lexer.rb |