Class: Sass::Script::Parser
- Inherits:
-
Object
- Object
- Sass::Script::Parser
- Defined in:
- lib/sass/script/parser.rb
Overview
The parser for SassScript. It parses a string of code into a tree of Tree::Nodes.
Direct Known Subclasses
Constant Summary collapse
- PRECEDENCE =
[ :comma, :single_eq, :space, :or, :and, [:eq, :neq], [:gt, :gte, :lt, :lte], [:plus, :minus], [:times, :div, :mod], ]
- ASSOCIATIVE =
[:plus, :times]
Class Method Summary collapse
-
.parse(str, line, offset, filename = nil) ⇒ Script::Tree::Node
Parses a SassScript expression.
Instance Method Summary collapse
-
#initialize(str, line, offset, options = {}) ⇒ Parser
constructor
A new instance of Parser.
-
#line ⇒ Fixnum
The line number of the parser's current position.
-
#offset ⇒ Fixnum
The column number of the parser's current position.
-
#parse ⇒ Script::Tree::Node
Parses a SassScript expression.
-
#parse_function_definition_arglist ⇒ (Array<Script::Tree::Node>, Script::Tree::Node)
Parses the argument list for a function definition.
-
#parse_interpolated(warn_for_color = false) ⇒ Script::Tree::Node
Parses a SassScript expression within an interpolated segment (
#{}
). -
#parse_mixin_definition_arglist ⇒ (Array<Script::Tree::Node>, Script::Tree::Node)
Parses the argument list for a mixin definition.
-
#parse_mixin_include_arglist ⇒ (Array<Script::Tree::Node>, {String => Script::Tree::Node}, Script::Tree::Node, Script::Tree::Node)
Parses the argument list for a mixin include.
-
#parse_string ⇒ Script::Tree::Node
Parse a single string value, possibly containing interpolation.
-
#parse_until(tokens) ⇒ Script::Tree::Node
Parses a SassScript expression, ending it when it encounters one of the given identifier tokens.
Constructor Details
#initialize(str, line, offset, options = {}) ⇒ Parser
Returns a new instance of Parser.
29 30 31 32 |
# File 'lib/sass/script/parser.rb', line 29
def initialize(str, line, offset, options = {})
@options = options
@lexer = lexer_class.new(str, line, offset, options)
end
|
Class Method Details
.parse(str, line, offset, filename = nil) ⇒ Script::Tree::Node
Parses a SassScript expression.
182 183 184 |
# File 'lib/sass/script/parser.rb', line 182
def self.parse(*args)
new(*args).parse
end
|
Instance Method Details
#line ⇒ Fixnum
The line number of the parser's current position.
11 12 13 |
# File 'lib/sass/script/parser.rb', line 11
def line
@lexer.line
end
|
#offset ⇒ Fixnum
The column number of the parser's current position.
18 19 20 |
# File 'lib/sass/script/parser.rb', line 18
def offset
@lexer.offset
end
|
#parse ⇒ Script::Tree::Node
Parses a SassScript expression.
61 62 63 64 65 66 67 68 69 |
# File 'lib/sass/script/parser.rb', line 61
def parse
expr = assert_expr :expr
assert_done
expr.options = @options
expr
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_function_definition_arglist ⇒ (Array<Script::Tree::Node>, Script::Tree::Node)
Parses the argument list for a function definition.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/sass/script/parser.rb', line 140
def parse_function_definition_arglist
args, splat = defn_arglist!(true)
assert_done
args.each do |k, v|
k.options = @options
v.options = @options if v
end
splat.options = @options if splat
return args, splat
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_interpolated(warn_for_color = false) ⇒ Script::Tree::Node
Parses a SassScript expression within an interpolated segment (#{}
).
This means that it stops when it comes across an unmatched }
,
which signals the end of an interpolated segment,
it returns rather than throwing an error.
43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/sass/script/parser.rb', line 43
def parse_interpolated(warn_for_color = false)
# Start two characters back to compensate for #{
start_pos = Sass::Source::Position.new(line, offset - 2)
expr = assert_expr :expr
assert_tok :end_interpolation
expr = Sass::Script::Tree::Interpolation.new(
nil, expr, nil, !:wb, !:wa, !:originally_text, warn_for_color)
expr.options = @options
node(expr, start_pos)
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_mixin_definition_arglist ⇒ (Array<Script::Tree::Node>, Script::Tree::Node)
Parses the argument list for a mixin definition.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/sass/script/parser.rb', line 120
def parse_mixin_definition_arglist
args, splat = defn_arglist!(false)
assert_done
args.each do |k, v|
k.options = @options
v.options = @options if v
end
splat.options = @options if splat
return args, splat
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_mixin_include_arglist ⇒ (Array<Script::Tree::Node>, {String => Script::Tree::Node}, Script::Tree::Node, Script::Tree::Node)
Parses the argument list for a mixin include.
The root nodes of the positional arguments, keyword arguments, and splat argument(s). Keyword arguments are in a hash from names to values.
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/sass/script/parser.rb', line 97
def parse_mixin_include_arglist
args, keywords = [], {}
if try_tok(:lparen)
args, keywords, splat, kwarg_splat = mixin_arglist
assert_tok(:rparen)
end
assert_done
args.each {|a| a.options = @options}
keywords.each {|k, v| v.options = @options}
splat.options = @options if splat
kwarg_splat.options = @options if kwarg_splat
return args, keywords, splat, kwarg_splat
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_string ⇒ Script::Tree::Node
Parse a single string value, possibly containing interpolation. Doesn't assert that the scanner is finished after parsing.
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/sass/script/parser.rb', line 160
def parse_string
unless (peek = @lexer.peek) &&
(peek.type == :string ||
(peek.type == :funcall && peek.value.downcase == 'url'))
lexer.expected!("string")
end
expr = assert_expr :funcall
expr.options = @options
@lexer.unpeek!
expr
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|
#parse_until(tokens) ⇒ Script::Tree::Node
Parses a SassScript expression, ending it when it encounters one of the given identifier tokens.
77 78 79 80 81 82 83 84 85 86 |
# File 'lib/sass/script/parser.rb', line 77
def parse_until(tokens)
@stop_at = tokens
expr = assert_expr :expr
assert_done
expr.options = @options
expr
rescue Sass::SyntaxError => e
e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
raise e
end
|