Class: Sass::Script::Lexer

Inherits:
Object show all
Includes:
Sass::SCSS::RX
Defined in:
/var/www/sass-pages/.haml/lib/sass/script/lexer.rb

Overview

The lexical analyzer for SassScript. It takes a raw string and converts it to individual tokens that are easier to parse.

Direct Known Subclasses

CssLexer

Constant Summary

Instance Attribute Summary

Instance Method Summary

Methods included from Sass::SCSS::RX

escape_ident

Constructor Details

- (Lexer) initialize(str, line, offset, options)

A new instance of Lexer

Parameters:

  • (String, StringScanner) str — The source text to lex
  • (Fixnum) line — The line on which the SassScript appears. Used for error reporting
  • (Fixnum) offset — The number of characters in on which the SassScript appears. Used for error reporting
  • ({Symbol => Object}) options — An options hash; see the Sass options documentation


128
129
130
131
132
133
134
135
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 128

def initialize(str, line, offset, options)
  @scanner = str.is_a?(StringScanner) ? str : StringScanner.new(str)
  @line = line
  @offset = offset
  @options = options
  @interpolation_stack = []
  @prev = nil
end

Instance Attribute Details

- (Fixnum) line (readonly)

The line number of the lexer’s current position.

Returns:

  • (Fixnum)


34
35
36
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 34

def line
  @line
end

- (Fixnum) offset (readonly)

The number of bytes into the current line of the lexer’s current position.

Returns:

  • (Fixnum)


40
41
42
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 40

def offset
  @offset
end

Instance Method Details

- (Boolean) after_interpolation?

Whether or not the last token lexed was :end_interpolation.

Returns:

  • (Boolean) — Whether or not the last token lexed was :end_interpolation.


179
180
181
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 179

def after_interpolation?
  @prev && @prev.type == :end_interpolation
end

- (Boolean) done?

Whether or not there’s more source text to lex.

Returns:

  • (Boolean) — Whether or not there’s more source text to lex.


173
174
175
176
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 173

def done?
  whitespace unless after_interpolation? && @interpolation_stack.last
  @scanner.eos? && @tok.nil?
end

- expected!(name)

Raise an error to the effect that name was expected in the input stream and wasn’t found.

This calls #unpeek! to rewind the scanner to immediately after the last returned token.

Parameters:

  • (String) name — The name of the entity that was expected but not found

Raises:



191
192
193
194
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 191

def expected!(name)
  unpeek!
  Sass::SCSS::Parser.expected(@scanner, name, @line)
end

- (Token) next

Moves the lexer forward one token.

Returns:

  • (Token) — The token that was moved past


140
141
142
143
144
145
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 140

def next
  @tok ||= read_token
  @tok, tok = nil, @tok
  @prev = tok
  return tok
end

- (Token) peek

Returns the next token without moving the lexer forward.

Returns:

  • (Token) — The next token


162
163
164
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 162

def peek
  @tok ||= read_token
end

- (String) str { ... }

Records all non-comment text the lexer consumes within the block and returns it as a string.

Yields:

  • A block in which text is recorded

Returns:



201
202
203
204
205
206
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 201

def str
  old_pos = @tok ? @tok.pos : @scanner.pos
  yield
  new_pos = @tok ? @tok.pos : @scanner.pos
  @scanner.string[old_pos...new_pos]
end

- unpeek!

Rewinds the underlying StringScanner to before the token returned by #peek.



168
169
170
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 168

def unpeek!
  @scanner.pos = @tok.pos if @tok
end

- (Boolean) whitespace?(tok = @tok)

Returns whether or not there’s whitespace before the next token.

Returns:

  • (Boolean)


150
151
152
153
154
155
156
157
# File '/var/www/sass-pages/.haml/lib/sass/script/lexer.rb', line 150

def whitespace?(tok = @tok)
  if tok
    @scanner.string[0...tok.pos] =~ /\s\Z/
  else
    @scanner.string[@scanner.pos, 1] =~ /^\s/ ||
      @scanner.string[@scanner.pos - 1, 1] =~ /\s\Z/
  end
end