Class: Sass::Script::Lexer
Overview
The lexical analyzer for SassScript. It takes a raw string and converts it to individual tokens that are easier to parse.
Defined Under Namespace
Classes: Token
Constant Summary collapse
- OPERATORS =
A hash from operator strings to the corresponding token types.
{ '+' => :plus, '-' => :minus, '*' => :times, '/' => :div, '%' => :mod, '(' => :lparen, ')' => :rparen, ',' => :comma, 'and' => :and, 'or' => :or, 'not' => :not, '==' => :eq, '!=' => :neq, '>=' => :gte, '<=' => :lte, '>' => :gt, '<' => :lt, '#{' => :begin_interpolation, '}' => :end_interpolation, }
- OP_NAMES =
A list of operator strings ordered with longer names first so that ‘>` and `<` don’t clobber ‘>=` and `<=`.
OPERATORS.keys.sort_by {|o| -o.size}
- REGULAR_EXPRESSIONS =
A hash of regular expressions that are used for tokenizing.
{ :whitespace => /\s*/, :variable => /!(\w+)/, :ident => /(\\.|\#\{|[^\s\\+\-*\/%(),=!])+/, :string_end => /((?:\\.|\#[^{]|[^"\\#])*)(?:"|(?=#\{))/, :number => /(-)?(?:(\d*\.\d+)|(\d+))([a-zA-Z%]+)?/, :color => /\##{"([0-9a-fA-F]{1,2})" * 3}|(#{Color::HTML4_COLORS.keys.join("|")})/, :bool => /(true|false)\b/, :op => %r{(#{Regexp.union(*OP_NAMES.map{|s| Regexp.new(Regexp.escape(s) + (s =~ /\w$/ ? '(?:\b|$)' : ''))})})} }
Instance Method Summary collapse
-
#done? ⇒ Boolean
Whether or not there’s more source text to lex.
-
#initialize(str, line, offset) ⇒ Lexer
constructor
A new instance of Lexer.
-
#next ⇒ Token
Moves the lexer forward one token.
-
#peek ⇒ Token
Returns the next token without moving the lexer forward.
Constructor Details
#initialize(str, line, offset) ⇒ Lexer
Returns a new instance of Lexer.
68 69 70 71 72 73 |
# File 'lib/sass/script/lexer.rb', line 68 def initialize(str, line, offset) @scanner = str.is_a?(StringScanner) ? str : StringScanner.new(str) @line = line @offset = offset @prev = nil end |
Instance Method Details
#done? ⇒ Boolean
Returns Whether or not there’s more source text to lex.
93 94 95 96 |
# File 'lib/sass/script/lexer.rb', line 93 def done? whitespace unless after_interpolation? @scanner.eos? && @tok.nil? end |
#next ⇒ Token
Moves the lexer forward one token.
78 79 80 81 82 83 |
# File 'lib/sass/script/lexer.rb', line 78 def next @tok ||= read_token @tok, tok = nil, @tok @prev = tok return tok end |
#peek ⇒ Token
Returns the next token without moving the lexer forward.
88 89 90 |
# File 'lib/sass/script/lexer.rb', line 88 def peek @tok ||= read_token end |