mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-04 01:25:14 -07:00
Test a different lexer architechture
This commit is contained in:
+22
-13
@@ -29,11 +29,17 @@ module Liquid
|
|||||||
'[' => :open_square,
|
'[' => :open_square,
|
||||||
']' => :close_square
|
']' => :close_square
|
||||||
}
|
}
|
||||||
IDENTIFIER = /[\w\-]+/
|
|
||||||
SINGLE_STRING_LITERAL = /'[^\']*'/
|
MATCHERS = {
|
||||||
DOUBLE_STRING_LITERAL = /"[^\"]*"/
|
/([\w\-]+)/ => :id,
|
||||||
INTEGER_LITERAL = /-?\d+/
|
/('[^\']*')/ => :string,
|
||||||
FLOAT_LITERAL = /-?\d+(?:\.\d+)?/
|
/("[^\"]*")/ => :string,
|
||||||
|
/(-?\d+)/ => :integer,
|
||||||
|
/(-?\d+(?:\.\d+)?)/ => :float
|
||||||
|
}
|
||||||
|
MATCHER_REGEX = Regexp.union(MATCHERS.keys)
|
||||||
|
MATCHER_TOKENS = MATCHERS.values
|
||||||
|
|
||||||
|
|
||||||
def initialize(input)
|
def initialize(input)
|
||||||
@ss = StringScanner.new(input)
|
@ss = StringScanner.new(input)
|
||||||
@@ -56,13 +62,17 @@ module Liquid
|
|||||||
consume_whitespace
|
consume_whitespace
|
||||||
return if @ss.eos?
|
return if @ss.eos?
|
||||||
|
|
||||||
case
|
tok_contents = @ss.scan(MATCHER_REGEX)
|
||||||
when t = @ss.scan(IDENTIFIER) then Token[:id, t]
|
tok_type = nil
|
||||||
when t = @ss.scan(SINGLE_STRING_LITERAL) then Token[:string, t]
|
MATCHER_TOKENS.each_with_index do |type, i|
|
||||||
when t = @ss.scan(DOUBLE_STRING_LITERAL) then Token[:string, t]
|
if @ss[i+1]
|
||||||
when t = @ss.scan(INTEGER_LITERAL) then Token[:integer, t]
|
tok_type = type
|
||||||
when t = @ss.scan(FLOAT_LITERAL) then Token[:float, t]
|
break
|
||||||
else
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Token[tok_type, tok_contents] if tok_type
|
||||||
|
|
||||||
c = @ss.getch
|
c = @ss.getch
|
||||||
if s = SPECIALS[c]
|
if s = SPECIALS[c]
|
||||||
return Token[s,c]
|
return Token[s,c]
|
||||||
@@ -70,7 +80,6 @@ module Liquid
|
|||||||
|
|
||||||
raise SyntaxError, "Unexpected character #{c}."
|
raise SyntaxError, "Unexpected character #{c}."
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def consume_whitespace
|
def consume_whitespace
|
||||||
@ss.skip(/\s*/)
|
@ss.skip(/\s*/)
|
||||||
|
|||||||
Reference in New Issue
Block a user