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, '=' => :single_eq, '(' => :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, filename) ⇒ 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, filename) ⇒ Lexer
Returns a new instance of Lexer.
69 70 71 72 73 74 75 |
# File 'lib/sass/script/lexer.rb', line 69
def initialize(str, line, offset, filename)
@scanner = str.is_a?(StringScanner) ? str : StringScanner.new(str)
@line = line
@offset = offset
@filename = filename
@prev = nil
end
|
Instance Method Details
#done? ⇒ Boolean
Returns Whether or not there's more source text to lex.
95 96 97 98 |
# File 'lib/sass/script/lexer.rb', line 95
def done?
whitespace unless after_interpolation?
@scanner.eos? && @tok.nil?
end
|
#next ⇒ Token
Moves the lexer forward one token.
80 81 82 83 84 85 |
# File 'lib/sass/script/lexer.rb', line 80
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.
90 91 92 |
# File 'lib/sass/script/lexer.rb', line 90
def peek
@tok ||= read_token
end
|