cloudhead-less 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/bin/lessc +8 -2
- data/less.gemspec +8 -92
- data/lib/ext.rb +8 -7
- data/lib/less/command.rb +12 -15
- data/lib/less/engine/grammar/less.tt +7 -3
- data/lib/less/engine.rb +3 -2
- data/lib/less.rb +2 -2
- data/spec/css/css-3.css +1 -0
- data/spec/less/css-3.less +4 -0
- data/spec/less/import.less +1 -0
- metadata +23 -94
- data/lib/vendor/treetop/.gitignore +0 -7
- data/lib/vendor/treetop/LICENSE +0 -19
- data/lib/vendor/treetop/README +0 -164
- data/lib/vendor/treetop/Rakefile +0 -19
- data/lib/vendor/treetop/benchmark/seqpar.gnuplot +0 -15
- data/lib/vendor/treetop/benchmark/seqpar.treetop +0 -16
- data/lib/vendor/treetop/benchmark/seqpar_benchmark.rb +0 -107
- data/lib/vendor/treetop/bin/tt +0 -28
- data/lib/vendor/treetop/lib/treetop/bootstrap_gen_1_metagrammar.rb +0 -45
- data/lib/vendor/treetop/lib/treetop/compiler/grammar_compiler.rb +0 -42
- data/lib/vendor/treetop/lib/treetop/compiler/lexical_address_space.rb +0 -17
- data/lib/vendor/treetop/lib/treetop/compiler/metagrammar.rb +0 -3097
- data/lib/vendor/treetop/lib/treetop/compiler/metagrammar.treetop +0 -408
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/anything_symbol.rb +0 -18
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/atomic_expression.rb +0 -14
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/character_class.rb +0 -24
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/choice.rb +0 -31
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/declaration_sequence.rb +0 -24
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/grammar.rb +0 -28
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/inline_module.rb +0 -27
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/nonterminal.rb +0 -13
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/optional.rb +0 -19
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parenthesized_expression.rb +0 -9
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parsing_expression.rb +0 -138
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parsing_rule.rb +0 -55
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/predicate.rb +0 -45
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/repetition.rb +0 -55
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/sequence.rb +0 -68
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/terminal.rb +0 -20
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/transient_prefix.rb +0 -9
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes/treetop_file.rb +0 -9
- data/lib/vendor/treetop/lib/treetop/compiler/node_classes.rb +0 -19
- data/lib/vendor/treetop/lib/treetop/compiler/ruby_builder.rb +0 -113
- data/lib/vendor/treetop/lib/treetop/compiler.rb +0 -6
- data/lib/vendor/treetop/lib/treetop/ruby_extensions/string.rb +0 -42
- data/lib/vendor/treetop/lib/treetop/ruby_extensions.rb +0 -2
- data/lib/vendor/treetop/lib/treetop/runtime/compiled_parser.rb +0 -105
- data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/head_node.rb +0 -15
- data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/interval_skip_list.rb +0 -200
- data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/node.rb +0 -164
- data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list.rb +0 -4
- data/lib/vendor/treetop/lib/treetop/runtime/syntax_node.rb +0 -72
- data/lib/vendor/treetop/lib/treetop/runtime/terminal_parse_failure.rb +0 -16
- data/lib/vendor/treetop/lib/treetop/runtime/terminal_syntax_node.rb +0 -17
- data/lib/vendor/treetop/lib/treetop/runtime.rb +0 -5
- data/lib/vendor/treetop/lib/treetop/version.rb +0 -9
- data/lib/vendor/treetop/lib/treetop.rb +0 -8
- data/lib/vendor/treetop/spec/compiler/and_predicate_spec.rb +0 -36
- data/lib/vendor/treetop/spec/compiler/anything_symbol_spec.rb +0 -44
- data/lib/vendor/treetop/spec/compiler/character_class_spec.rb +0 -182
- data/lib/vendor/treetop/spec/compiler/choice_spec.rb +0 -80
- data/lib/vendor/treetop/spec/compiler/circular_compilation_spec.rb +0 -28
- data/lib/vendor/treetop/spec/compiler/failure_propagation_functional_spec.rb +0 -21
- data/lib/vendor/treetop/spec/compiler/grammar_compiler_spec.rb +0 -84
- data/lib/vendor/treetop/spec/compiler/grammar_spec.rb +0 -41
- data/lib/vendor/treetop/spec/compiler/nonterminal_symbol_spec.rb +0 -40
- data/lib/vendor/treetop/spec/compiler/not_predicate_spec.rb +0 -38
- data/lib/vendor/treetop/spec/compiler/one_or_more_spec.rb +0 -35
- data/lib/vendor/treetop/spec/compiler/optional_spec.rb +0 -37
- data/lib/vendor/treetop/spec/compiler/parenthesized_expression_spec.rb +0 -19
- data/lib/vendor/treetop/spec/compiler/parsing_rule_spec.rb +0 -32
- data/lib/vendor/treetop/spec/compiler/sequence_spec.rb +0 -115
- data/lib/vendor/treetop/spec/compiler/terminal_spec.rb +0 -81
- data/lib/vendor/treetop/spec/compiler/terminal_symbol_spec.rb +0 -37
- data/lib/vendor/treetop/spec/compiler/test_grammar.treetop +0 -7
- data/lib/vendor/treetop/spec/compiler/test_grammar.tt +0 -7
- data/lib/vendor/treetop/spec/compiler/test_grammar_do.treetop +0 -7
- data/lib/vendor/treetop/spec/compiler/zero_or_more_spec.rb +0 -56
- data/lib/vendor/treetop/spec/composition/a.treetop +0 -11
- data/lib/vendor/treetop/spec/composition/b.treetop +0 -11
- data/lib/vendor/treetop/spec/composition/c.treetop +0 -10
- data/lib/vendor/treetop/spec/composition/d.treetop +0 -10
- data/lib/vendor/treetop/spec/composition/f.treetop +0 -17
- data/lib/vendor/treetop/spec/composition/grammar_composition_spec.rb +0 -40
- data/lib/vendor/treetop/spec/composition/subfolder/e_includes_c.treetop +0 -15
- data/lib/vendor/treetop/spec/ruby_extensions/string_spec.rb +0 -32
- data/lib/vendor/treetop/spec/runtime/compiled_parser_spec.rb +0 -101
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/delete_spec.rb +0 -147
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/expire_range_spec.rb +0 -349
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/insert_and_delete_node.rb +0 -385
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/insert_spec.rb +0 -660
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/interval_skip_list_spec.graffle +0 -6175
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/interval_skip_list_spec.rb +0 -58
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/palindromic_fixture.rb +0 -23
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/palindromic_fixture_spec.rb +0 -164
- data/lib/vendor/treetop/spec/runtime/interval_skip_list/spec_helper.rb +0 -84
- data/lib/vendor/treetop/spec/runtime/syntax_node_spec.rb +0 -53
- data/lib/vendor/treetop/spec/spec_helper.rb +0 -106
- data/lib/vendor/treetop/spec/spec_suite.rb +0 -4
- data/lib/vendor/treetop/treetop.gemspec +0 -17
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class ParsingExpression < Runtime::SyntaxNode
|
|
4
|
-
attr_reader :address, :builder, :subexpression_address, :var_symbols, :parent_expression
|
|
5
|
-
|
|
6
|
-
def compile(address, builder, parent_expression)
|
|
7
|
-
@address = address
|
|
8
|
-
@builder = builder
|
|
9
|
-
@parent_expression = parent_expression
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def node_class_name
|
|
13
|
-
parent_expression && parent_expression.node_class_name || 'SyntaxNode'
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def declared_module_name
|
|
17
|
-
parent_expression && parent_expression.node_class_name
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def inline_module_name
|
|
21
|
-
parent_expression && parent_expression.inline_module_name
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def optional_arg(arg)
|
|
25
|
-
if arg
|
|
26
|
-
", #{arg}"
|
|
27
|
-
else
|
|
28
|
-
''
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def use_vars(*var_symbols)
|
|
33
|
-
@var_symbols = var_symbols
|
|
34
|
-
builder << var_initialization
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def result_var
|
|
38
|
-
var(:result)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def accumulator_var
|
|
42
|
-
var(:accumulator)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def start_index_var
|
|
46
|
-
var(:start_index)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def subexpression_result_var
|
|
50
|
-
"r#{subexpression_address}"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def subexpression_success?
|
|
54
|
-
subexpression_result_var
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def obtain_new_subexpression_address
|
|
58
|
-
@subexpression_address = builder.next_address
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def accumulate_subexpression_result
|
|
62
|
-
builder.accumulate accumulator_var, subexpression_result_var
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def assign_result(value_ruby)
|
|
66
|
-
builder.assign result_var, value_ruby
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def extend_result(module_name)
|
|
70
|
-
builder.extend result_var, module_name
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def extend_result_with_declared_module
|
|
74
|
-
extend_result declared_module_name if declared_module_name
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def extend_result_with_inline_module
|
|
78
|
-
extend_result inline_module_name if inline_module_name
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def reset_index
|
|
82
|
-
builder.assign '@index', start_index_var
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def epsilon_node
|
|
86
|
-
"instantiate_node(SyntaxNode,input, index...index)"
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def assign_failure(start_index_var)
|
|
90
|
-
assign_result("nil")
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def var_initialization
|
|
94
|
-
left, right = [], []
|
|
95
|
-
var_symbols.each do |symbol|
|
|
96
|
-
if init_value(symbol)
|
|
97
|
-
left << var(symbol)
|
|
98
|
-
right << init_value(symbol)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
if left.empty?
|
|
102
|
-
""
|
|
103
|
-
else
|
|
104
|
-
left.join(', ') + ' = ' + right.join(', ')
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def var(var_symbol)
|
|
109
|
-
case var_symbol
|
|
110
|
-
when :result then "r#{address}"
|
|
111
|
-
when :accumulator then "s#{address}"
|
|
112
|
-
when :start_index then "i#{address}"
|
|
113
|
-
else raise "Unknown var symbol #{var_symbol}."
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def init_value(var_symbol)
|
|
118
|
-
case var_symbol
|
|
119
|
-
when :accumulator then '[]'
|
|
120
|
-
when :start_index then 'index'
|
|
121
|
-
else nil
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def begin_comment(expression)
|
|
126
|
-
#builder << "# begin #{on_one_line(expression)}"
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def end_comment(expression)
|
|
130
|
-
#builder << "# end #{on_one_line(expression)}"
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def on_one_line(expression)
|
|
134
|
-
expression.text_value.tr("\n", ' ')
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class ParsingRule < Runtime::SyntaxNode
|
|
4
|
-
|
|
5
|
-
def compile(builder)
|
|
6
|
-
compile_inline_module_declarations(builder)
|
|
7
|
-
generate_method_definition(builder)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def compile_inline_module_declarations(builder)
|
|
11
|
-
parsing_expression.inline_modules.each_with_index do |inline_module, i|
|
|
12
|
-
inline_module.compile(i, builder, self)
|
|
13
|
-
builder.newline
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def generate_method_definition(builder)
|
|
18
|
-
builder.reset_addresses
|
|
19
|
-
expression_address = builder.next_address
|
|
20
|
-
result_var = "r#{expression_address}"
|
|
21
|
-
|
|
22
|
-
builder.method_declaration(method_name) do
|
|
23
|
-
builder.assign 'start_index', 'index'
|
|
24
|
-
generate_cache_lookup(builder)
|
|
25
|
-
builder.newline
|
|
26
|
-
parsing_expression.compile(expression_address, builder)
|
|
27
|
-
builder.newline
|
|
28
|
-
generate_cache_storage(builder, result_var)
|
|
29
|
-
builder.newline
|
|
30
|
-
builder << result_var
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def generate_cache_lookup(builder)
|
|
35
|
-
builder.if_ "node_cache[:#{name}].has_key?(index)" do
|
|
36
|
-
builder.assign 'cached', "node_cache[:#{name}][index]"
|
|
37
|
-
builder << '@index = cached.interval.end if cached'
|
|
38
|
-
builder << 'return cached'
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def generate_cache_storage(builder, result_var)
|
|
43
|
-
builder.assign "node_cache[:#{name}][start_index]", result_var
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def method_name
|
|
47
|
-
"_nt_#{name}"
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def name
|
|
51
|
-
nonterminal.text_value
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class Predicate < ParsingExpression
|
|
4
|
-
def compile(address, builder, parent_expression)
|
|
5
|
-
super
|
|
6
|
-
begin_comment(parent_expression)
|
|
7
|
-
use_vars :result, :start_index
|
|
8
|
-
obtain_new_subexpression_address
|
|
9
|
-
parent_expression.prefixed_expression.compile(subexpression_address, builder)
|
|
10
|
-
builder.if__(subexpression_success?) { when_success }
|
|
11
|
-
builder.else_ { when_failure }
|
|
12
|
-
end_comment(parent_expression)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def assign_failure
|
|
16
|
-
super(start_index_var)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def assign_success
|
|
20
|
-
reset_index
|
|
21
|
-
assign_result epsilon_node
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class AndPredicate < Predicate
|
|
26
|
-
def when_success
|
|
27
|
-
assign_success
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def when_failure
|
|
31
|
-
assign_failure
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
class NotPredicate < Predicate
|
|
36
|
-
def when_success
|
|
37
|
-
assign_failure
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def when_failure
|
|
41
|
-
assign_success
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class Repetition < ParsingExpression
|
|
4
|
-
def compile(address, builder, parent_expression)
|
|
5
|
-
super
|
|
6
|
-
repeated_expression = parent_expression.atomic
|
|
7
|
-
begin_comment(parent_expression)
|
|
8
|
-
use_vars :result, :accumulator, :start_index
|
|
9
|
-
|
|
10
|
-
builder.loop do
|
|
11
|
-
obtain_new_subexpression_address
|
|
12
|
-
repeated_expression.compile(subexpression_address, builder)
|
|
13
|
-
builder.if__ subexpression_success? do
|
|
14
|
-
accumulate_subexpression_result
|
|
15
|
-
end
|
|
16
|
-
builder.else_ do
|
|
17
|
-
builder.break
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def inline_module_name
|
|
23
|
-
parent_expression.inline_module_name
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def assign_and_extend_result
|
|
27
|
-
assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
|
|
28
|
-
extend_result_with_inline_module
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class ZeroOrMore < Repetition
|
|
34
|
-
def compile(address, builder, parent_expression)
|
|
35
|
-
super
|
|
36
|
-
assign_and_extend_result
|
|
37
|
-
end_comment(parent_expression)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
class OneOrMore < Repetition
|
|
42
|
-
def compile(address, builder, parent_expression)
|
|
43
|
-
super
|
|
44
|
-
builder.if__ "#{accumulator_var}.empty?" do
|
|
45
|
-
reset_index
|
|
46
|
-
assign_failure start_index_var
|
|
47
|
-
end
|
|
48
|
-
builder.else_ do
|
|
49
|
-
assign_and_extend_result
|
|
50
|
-
end
|
|
51
|
-
end_comment(parent_expression)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class Sequence < ParsingExpression
|
|
4
|
-
def compile(address, builder, parent_expression = nil)
|
|
5
|
-
super
|
|
6
|
-
begin_comment(self)
|
|
7
|
-
use_vars :result, :start_index, :accumulator
|
|
8
|
-
compile_sequence_elements(sequence_elements)
|
|
9
|
-
builder.if__ "#{accumulator_var}.last" do
|
|
10
|
-
assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
|
|
11
|
-
extend_result sequence_element_accessor_module_name if sequence_element_accessor_module_name
|
|
12
|
-
extend_result_with_inline_module
|
|
13
|
-
end
|
|
14
|
-
builder.else_ do
|
|
15
|
-
reset_index
|
|
16
|
-
assign_failure start_index_var
|
|
17
|
-
end
|
|
18
|
-
end_comment(self)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def node_class_name
|
|
22
|
-
node_class_declarations.node_class_name || 'SyntaxNode'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def compile_sequence_elements(elements)
|
|
26
|
-
obtain_new_subexpression_address
|
|
27
|
-
elements.first.compile(subexpression_address, builder)
|
|
28
|
-
accumulate_subexpression_result
|
|
29
|
-
if elements.size > 1
|
|
30
|
-
builder.if_ subexpression_success? do
|
|
31
|
-
compile_sequence_elements(elements[1..-1])
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def sequence_element_accessor_module
|
|
37
|
-
@sequence_element_accessor_module ||= SequenceElementAccessorModule.new(sequence_elements)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def sequence_element_accessor_module_name
|
|
41
|
-
sequence_element_accessor_module.module_name
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
class SequenceElementAccessorModule
|
|
46
|
-
include InlineModuleMixin
|
|
47
|
-
attr_reader :sequence_elements
|
|
48
|
-
|
|
49
|
-
def initialize(sequence_elements)
|
|
50
|
-
@sequence_elements = sequence_elements
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def compile(index, builder, rule)
|
|
54
|
-
super
|
|
55
|
-
builder.module_declaration(module_name) do
|
|
56
|
-
sequence_elements.each_with_index do |element, index|
|
|
57
|
-
if element.label_name
|
|
58
|
-
builder.method_declaration(element.label_name) do
|
|
59
|
-
builder << "elements[#{index}]"
|
|
60
|
-
end
|
|
61
|
-
builder.newline unless index == sequence_elements.size - 1
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class Terminal < AtomicExpression
|
|
4
|
-
def compile(address, builder, parent_expression = nil)
|
|
5
|
-
super
|
|
6
|
-
string_length = eval(text_value).length
|
|
7
|
-
|
|
8
|
-
builder.if__ "has_terminal?(#{text_value}, false, index)" do
|
|
9
|
-
assign_result "instantiate_node(#{node_class_name},input, index...(index + #{string_length}))"
|
|
10
|
-
extend_result_with_inline_module
|
|
11
|
-
builder << "@index += #{string_length}"
|
|
12
|
-
end
|
|
13
|
-
builder.else_ do
|
|
14
|
-
builder << "terminal_parse_failure(#{text_value})"
|
|
15
|
-
assign_result 'nil'
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
dir = File.dirname(__FILE__)
|
|
2
|
-
require File.join(dir, *%w[node_classes parsing_expression])
|
|
3
|
-
require File.join(dir, *%w[node_classes atomic_expression])
|
|
4
|
-
require File.join(dir, *%w[node_classes inline_module])
|
|
5
|
-
require File.join(dir, *%w[node_classes treetop_file])
|
|
6
|
-
require File.join(dir, *%w[node_classes grammar])
|
|
7
|
-
require File.join(dir, *%w[node_classes declaration_sequence])
|
|
8
|
-
require File.join(dir, *%w[node_classes parsing_rule])
|
|
9
|
-
require File.join(dir, *%w[node_classes parenthesized_expression])
|
|
10
|
-
require File.join(dir, *%w[node_classes nonterminal])
|
|
11
|
-
require File.join(dir, *%w[node_classes terminal])
|
|
12
|
-
require File.join(dir, *%w[node_classes anything_symbol])
|
|
13
|
-
require File.join(dir, *%w[node_classes character_class])
|
|
14
|
-
require File.join(dir, *%w[node_classes sequence])
|
|
15
|
-
require File.join(dir, *%w[node_classes choice])
|
|
16
|
-
require File.join(dir, *%w[node_classes repetition])
|
|
17
|
-
require File.join(dir, *%w[node_classes optional])
|
|
18
|
-
require File.join(dir, *%w[node_classes predicate])
|
|
19
|
-
require File.join(dir, *%w[node_classes transient_prefix])
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Compiler
|
|
3
|
-
class RubyBuilder
|
|
4
|
-
|
|
5
|
-
attr_reader :level, :address_space, :ruby
|
|
6
|
-
|
|
7
|
-
def initialize
|
|
8
|
-
@level = 0
|
|
9
|
-
@address_space = LexicalAddressSpace.new
|
|
10
|
-
@ruby = ""
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def <<(ruby_line)
|
|
14
|
-
return if ruby_line.blank?
|
|
15
|
-
ruby << ruby_line.tabto(level) << "\n"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def newline
|
|
19
|
-
ruby << "\n"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def indented(depth = 2)
|
|
23
|
-
self.in(depth)
|
|
24
|
-
yield
|
|
25
|
-
self.out(depth)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def class_declaration(name, &block)
|
|
29
|
-
self << "class #{name}"
|
|
30
|
-
indented(&block)
|
|
31
|
-
self << "end"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def module_declaration(name, &block)
|
|
35
|
-
self << "module #{name}"
|
|
36
|
-
indented(&block)
|
|
37
|
-
self << "end"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def method_declaration(name, &block)
|
|
41
|
-
self << "def #{name}"
|
|
42
|
-
indented(&block)
|
|
43
|
-
self << "end"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def assign(left, right)
|
|
47
|
-
if left.instance_of? Array
|
|
48
|
-
self << "#{left.join(', ')} = #{right.join(', ')}"
|
|
49
|
-
else
|
|
50
|
-
self << "#{left} = #{right}"
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def extend(var, module_name)
|
|
55
|
-
self << "#{var}.extend(#{module_name})"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def accumulate(left, right)
|
|
59
|
-
self << "#{left} << #{right}"
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def if__(condition, &block)
|
|
63
|
-
self << "if #{condition}"
|
|
64
|
-
indented(&block)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def if_(condition, &block)
|
|
68
|
-
if__(condition, &block)
|
|
69
|
-
self << 'end'
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def else_(&block)
|
|
73
|
-
self << 'else'
|
|
74
|
-
indented(&block)
|
|
75
|
-
self << 'end'
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def loop(&block)
|
|
79
|
-
self << 'loop do'
|
|
80
|
-
indented(&block)
|
|
81
|
-
self << 'end'
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def break
|
|
85
|
-
self << 'break'
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def in(depth = 2)
|
|
89
|
-
@level += depth
|
|
90
|
-
self
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def out(depth = 2)
|
|
94
|
-
@level -= depth
|
|
95
|
-
self
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def next_address
|
|
99
|
-
address_space.next_address
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def reset_addresses
|
|
103
|
-
address_space.reset_addresses
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
private
|
|
107
|
-
|
|
108
|
-
def indent
|
|
109
|
-
" " * level
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
dir = File.dirname(__FILE__)
|
|
2
|
-
require File.join(dir, *%w[compiler lexical_address_space])
|
|
3
|
-
require File.join(dir, *%w[compiler ruby_builder])
|
|
4
|
-
require File.join(dir, *%w[compiler node_classes])
|
|
5
|
-
require File.join(dir, *%w[compiler metagrammar]) unless $exclude_metagrammar
|
|
6
|
-
require File.join(dir, *%w[compiler grammar_compiler])
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
class String
|
|
2
|
-
def column_of(index)
|
|
3
|
-
return 1 if index == 0
|
|
4
|
-
newline_index = rindex("\n", index - 1)
|
|
5
|
-
if newline_index
|
|
6
|
-
index - newline_index
|
|
7
|
-
else
|
|
8
|
-
index + 1
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def line_of(index)
|
|
13
|
-
self[0...index].count("\n") + 1
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
unless method_defined?(:blank?)
|
|
17
|
-
def blank?
|
|
18
|
-
self == ""
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# The following methods are lifted from Facets 2.0.2
|
|
23
|
-
def tabto(n)
|
|
24
|
-
if self =~ /^( *)\S/
|
|
25
|
-
indent(n - $1.length)
|
|
26
|
-
else
|
|
27
|
-
self
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def indent(n)
|
|
32
|
-
if n >= 0
|
|
33
|
-
gsub(/^/, ' ' * n)
|
|
34
|
-
else
|
|
35
|
-
gsub(/^ {0,#{-n}}/, "")
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def treetop_camelize
|
|
40
|
-
to_s.gsub(/\/(.?)/){ "::" + $1.upcase }.gsub(/(^|_)(.)/){ $2.upcase }
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
module Treetop
|
|
2
|
-
module Runtime
|
|
3
|
-
class CompiledParser
|
|
4
|
-
include Treetop::Runtime
|
|
5
|
-
|
|
6
|
-
attr_reader :input, :index, :terminal_failures, :max_terminal_failure_index
|
|
7
|
-
attr_writer :root
|
|
8
|
-
attr_accessor :consume_all_input
|
|
9
|
-
alias :consume_all_input? :consume_all_input
|
|
10
|
-
|
|
11
|
-
def initialize
|
|
12
|
-
self.consume_all_input = true
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def parse(input, options = {})
|
|
16
|
-
prepare_to_parse(input)
|
|
17
|
-
@index = options[:index] if options[:index]
|
|
18
|
-
result = send("_nt_#{root}")
|
|
19
|
-
return nil if (consume_all_input? && index != input.size)
|
|
20
|
-
return result
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def failure_index
|
|
24
|
-
max_terminal_failure_index
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def failure_line
|
|
28
|
-
terminal_failures && input.line_of(failure_index)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def failure_column
|
|
32
|
-
terminal_failures && input.column_of(failure_index)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def failure_reason
|
|
36
|
-
return nil unless (tf = terminal_failures) && tf.size > 0
|
|
37
|
-
"Expected " +
|
|
38
|
-
(tf.size == 1 ?
|
|
39
|
-
tf[0].expected_string :
|
|
40
|
-
"one of #{tf.map{|f| f.expected_string}.uniq*', '}"
|
|
41
|
-
) +
|
|
42
|
-
" at line #{failure_line}, column #{failure_column} (byte #{failure_index+1})" +
|
|
43
|
-
" after #{input[index...failure_index]}"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
protected
|
|
48
|
-
|
|
49
|
-
attr_reader :node_cache, :input_length
|
|
50
|
-
attr_writer :index
|
|
51
|
-
|
|
52
|
-
def prepare_to_parse(input)
|
|
53
|
-
@input = input
|
|
54
|
-
@input_length = input.length
|
|
55
|
-
reset_index
|
|
56
|
-
@node_cache = Hash.new {|hash, key| hash[key] = Hash.new}
|
|
57
|
-
@regexps = {}
|
|
58
|
-
@terminal_failures = []
|
|
59
|
-
@max_terminal_failure_index = 0
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def reset_index
|
|
63
|
-
@index = 0
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def parse_anything(node_class = SyntaxNode, inline_module = nil)
|
|
67
|
-
if index < input.length
|
|
68
|
-
result = instantiate_node(node_class,input, index...(index + 1))
|
|
69
|
-
result.extend(inline_module) if inline_module
|
|
70
|
-
@index += 1
|
|
71
|
-
result
|
|
72
|
-
else
|
|
73
|
-
terminal_parse_failure("any character")
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def instantiate_node(node_type,*args)
|
|
78
|
-
if node_type.respond_to? :new
|
|
79
|
-
node_type.new(*args)
|
|
80
|
-
else
|
|
81
|
-
SyntaxNode.new(*args).extend(node_type)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def has_terminal?(terminal, regex, index)
|
|
86
|
-
if regex
|
|
87
|
-
rx = @regexps[terminal] ||= Regexp.new(terminal)
|
|
88
|
-
input.index(rx, index) == index
|
|
89
|
-
else
|
|
90
|
-
input[index, terminal.size] == terminal
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def terminal_parse_failure(expected_string)
|
|
95
|
-
return nil if index < max_terminal_failure_index
|
|
96
|
-
if index > max_terminal_failure_index
|
|
97
|
-
@max_terminal_failure_index = index
|
|
98
|
-
@terminal_failures = []
|
|
99
|
-
end
|
|
100
|
-
terminal_failures << TerminalParseFailure.new(index, expected_string)
|
|
101
|
-
return nil
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|