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 |