kpeg 0.7
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/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +8 -0
- data/Rakefile +24 -0
- data/bin/kpeg +126 -0
- data/doc/syntax_kpeg/ftdetect/kpeg.vim +1 -0
- data/doc/syntax_kpeg/syntax/kpeg.vim +55 -0
- data/kpeg.gemspec +24 -0
- data/lib/kpeg.rb +50 -0
- data/lib/kpeg/code_generator.rb +355 -0
- data/lib/kpeg/compiled_parser.rb +299 -0
- data/lib/kpeg/format_parser.rb +2440 -0
- data/lib/kpeg/grammar.rb +807 -0
- data/lib/kpeg/grammar_renderer.rb +172 -0
- data/lib/kpeg/match.rb +70 -0
- data/lib/kpeg/parser.rb +193 -0
- data/lib/kpeg/position.rb +34 -0
- data/lib/kpeg/string_escape.rb +322 -0
- data/lib/kpeg/version.rb +3 -0
- data/test/test_file_parser_roundtrip.rb +112 -0
- data/test/test_gen_calc.rb +63 -0
- data/test/test_kpeg.rb +416 -0
- data/test/test_kpeg_code_generator.rb +1307 -0
- data/test/test_kpeg_compiled_parser.rb +81 -0
- data/test/test_kpeg_format.rb +467 -0
- data/test/test_kpeg_grammar_renderer.rb +223 -0
- metadata +97 -0
@@ -0,0 +1,299 @@
|
|
1
|
+
require 'kpeg/position'
|
2
|
+
|
3
|
+
module KPeg
|
4
|
+
class CompiledParser
|
5
|
+
|
6
|
+
# Leave these markers in! They allow us to generate standalone
|
7
|
+
# code automatically!
|
8
|
+
#
|
9
|
+
# STANDALONE START
|
10
|
+
def setup_parser(str, debug=false)
|
11
|
+
@string = str
|
12
|
+
@pos = 0
|
13
|
+
@memoizations = Hash.new { |h,k| h[k] = {} }
|
14
|
+
@result = nil
|
15
|
+
@failed_rule = nil
|
16
|
+
@failing_rule_offset = -1
|
17
|
+
|
18
|
+
setup_foreign_grammar
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup_foreign_grammar
|
22
|
+
end
|
23
|
+
|
24
|
+
# This is distinct from setup_parser so that a standalone parser
|
25
|
+
# can redefine #initialize and still have access to the proper
|
26
|
+
# parser setup code.
|
27
|
+
#
|
28
|
+
def initialize(str, debug=false)
|
29
|
+
setup_parser(str, debug)
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_reader :string
|
33
|
+
attr_reader :result, :failing_rule_offset
|
34
|
+
attr_accessor :pos
|
35
|
+
|
36
|
+
include Position
|
37
|
+
|
38
|
+
def get_text(start)
|
39
|
+
@string[start..@pos-1]
|
40
|
+
end
|
41
|
+
|
42
|
+
def show_pos
|
43
|
+
width = 10
|
44
|
+
if @pos < width
|
45
|
+
"#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
|
46
|
+
else
|
47
|
+
"#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def failure_info
|
52
|
+
l = current_line @failing_rule_offset
|
53
|
+
c = current_column @failing_rule_offset
|
54
|
+
|
55
|
+
if @failed_rule.kind_of? Symbol
|
56
|
+
info = self.class::Rules[@failed_rule]
|
57
|
+
"line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
|
58
|
+
else
|
59
|
+
"line #{l}, column #{c}: failed rule '#{@failed_rule}'"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def failure_caret
|
64
|
+
l = current_line @failing_rule_offset
|
65
|
+
c = current_column @failing_rule_offset
|
66
|
+
|
67
|
+
line = lines[l-1]
|
68
|
+
"#{line}\n#{' ' * (c - 1)}^"
|
69
|
+
end
|
70
|
+
|
71
|
+
def failure_character
|
72
|
+
l = current_line @failing_rule_offset
|
73
|
+
c = current_column @failing_rule_offset
|
74
|
+
lines[l-1][c-1, 1]
|
75
|
+
end
|
76
|
+
|
77
|
+
def failure_oneline
|
78
|
+
l = current_line @failing_rule_offset
|
79
|
+
c = current_column @failing_rule_offset
|
80
|
+
|
81
|
+
char = lines[l-1][c-1, 1]
|
82
|
+
|
83
|
+
if @failed_rule.kind_of? Symbol
|
84
|
+
info = self.class::Rules[@failed_rule]
|
85
|
+
"@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
|
86
|
+
else
|
87
|
+
"@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class ParseError < RuntimeError
|
92
|
+
end
|
93
|
+
|
94
|
+
def raise_error
|
95
|
+
raise ParseError, failure_oneline
|
96
|
+
end
|
97
|
+
|
98
|
+
def show_error(io=STDOUT)
|
99
|
+
error_pos = @failing_rule_offset
|
100
|
+
line_no = current_line(error_pos)
|
101
|
+
col_no = current_column(error_pos)
|
102
|
+
|
103
|
+
io.puts "On line #{line_no}, column #{col_no}:"
|
104
|
+
|
105
|
+
if @failed_rule.kind_of? Symbol
|
106
|
+
info = self.class::Rules[@failed_rule]
|
107
|
+
io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
|
108
|
+
else
|
109
|
+
io.puts "Failed to match rule '#{@failed_rule}'"
|
110
|
+
end
|
111
|
+
|
112
|
+
io.puts "Got: #{string[error_pos,1].inspect}"
|
113
|
+
line = lines[line_no-1]
|
114
|
+
io.puts "=> #{line}"
|
115
|
+
io.print(" " * (col_no + 3))
|
116
|
+
io.puts "^"
|
117
|
+
end
|
118
|
+
|
119
|
+
def set_failed_rule(name)
|
120
|
+
if @pos > @failing_rule_offset
|
121
|
+
@failed_rule = name
|
122
|
+
@failing_rule_offset = @pos
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
attr_reader :failed_rule
|
127
|
+
|
128
|
+
def match_string(str)
|
129
|
+
len = str.size
|
130
|
+
if @string[pos,len] == str
|
131
|
+
@pos += len
|
132
|
+
return str
|
133
|
+
end
|
134
|
+
|
135
|
+
return nil
|
136
|
+
end
|
137
|
+
|
138
|
+
def scan(reg)
|
139
|
+
if m = reg.match(@string[@pos..-1])
|
140
|
+
width = m.end(0)
|
141
|
+
@pos += width
|
142
|
+
return true
|
143
|
+
end
|
144
|
+
|
145
|
+
return nil
|
146
|
+
end
|
147
|
+
|
148
|
+
if "".respond_to? :getbyte
|
149
|
+
def get_byte
|
150
|
+
if @pos >= @string.size
|
151
|
+
return nil
|
152
|
+
end
|
153
|
+
|
154
|
+
s = @string.getbyte @pos
|
155
|
+
@pos += 1
|
156
|
+
s
|
157
|
+
end
|
158
|
+
else
|
159
|
+
def get_byte
|
160
|
+
if @pos >= @string.size
|
161
|
+
return nil
|
162
|
+
end
|
163
|
+
|
164
|
+
s = @string[@pos]
|
165
|
+
@pos += 1
|
166
|
+
s
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def parse(rule=nil)
|
171
|
+
if !rule
|
172
|
+
_root ? true : false
|
173
|
+
else
|
174
|
+
# This is not shared with code_generator.rb so this can be standalone
|
175
|
+
method = rule.gsub("-","_hyphen_")
|
176
|
+
__send__("_#{method}") ? true : false
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class LeftRecursive
|
181
|
+
def initialize(detected=false)
|
182
|
+
@detected = detected
|
183
|
+
end
|
184
|
+
|
185
|
+
attr_accessor :detected
|
186
|
+
end
|
187
|
+
|
188
|
+
class MemoEntry
|
189
|
+
def initialize(ans, pos)
|
190
|
+
@ans = ans
|
191
|
+
@pos = pos
|
192
|
+
@uses = 1
|
193
|
+
@result = nil
|
194
|
+
end
|
195
|
+
|
196
|
+
attr_reader :ans, :pos, :uses, :result
|
197
|
+
|
198
|
+
def inc!
|
199
|
+
@uses += 1
|
200
|
+
end
|
201
|
+
|
202
|
+
def move!(ans, pos, result)
|
203
|
+
@ans = ans
|
204
|
+
@pos = pos
|
205
|
+
@result = result
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def external_invoke(other, rule, *args)
|
210
|
+
old_pos = @pos
|
211
|
+
old_string = @string
|
212
|
+
|
213
|
+
@pos = other.pos
|
214
|
+
@string = other.string
|
215
|
+
|
216
|
+
begin
|
217
|
+
if val = __send__(rule, *args)
|
218
|
+
other.pos = @pos
|
219
|
+
else
|
220
|
+
other.set_failed_rule "#{self.class}##{rule}"
|
221
|
+
end
|
222
|
+
val
|
223
|
+
ensure
|
224
|
+
@pos = old_pos
|
225
|
+
@string = old_string
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def apply(rule)
|
230
|
+
if m = @memoizations[rule][@pos]
|
231
|
+
m.inc!
|
232
|
+
|
233
|
+
prev = @pos
|
234
|
+
@pos = m.pos
|
235
|
+
if m.ans.kind_of? LeftRecursive
|
236
|
+
m.ans.detected = true
|
237
|
+
return nil
|
238
|
+
end
|
239
|
+
|
240
|
+
@result = m.result
|
241
|
+
|
242
|
+
return m.ans
|
243
|
+
else
|
244
|
+
lr = LeftRecursive.new(false)
|
245
|
+
m = MemoEntry.new(lr, @pos)
|
246
|
+
@memoizations[rule][@pos] = m
|
247
|
+
start_pos = @pos
|
248
|
+
|
249
|
+
ans = __send__ rule
|
250
|
+
|
251
|
+
m.move! ans, @pos, @result
|
252
|
+
|
253
|
+
# Don't bother trying to grow the left recursion
|
254
|
+
# if it's failing straight away (thus there is no seed)
|
255
|
+
if ans and lr.detected
|
256
|
+
return grow_lr(rule, start_pos, m)
|
257
|
+
else
|
258
|
+
return ans
|
259
|
+
end
|
260
|
+
|
261
|
+
return ans
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def grow_lr(rule, start_pos, m)
|
266
|
+
while true
|
267
|
+
@pos = start_pos
|
268
|
+
@result = m.result
|
269
|
+
|
270
|
+
ans = __send__ rule
|
271
|
+
return nil unless ans
|
272
|
+
|
273
|
+
break if @pos <= m.pos
|
274
|
+
|
275
|
+
m.move! ans, @pos, @result
|
276
|
+
end
|
277
|
+
|
278
|
+
@result = m.result
|
279
|
+
@pos = m.pos
|
280
|
+
return m.ans
|
281
|
+
end
|
282
|
+
|
283
|
+
class RuleInfo
|
284
|
+
def initialize(name, rendered)
|
285
|
+
@name = name
|
286
|
+
@rendered = rendered
|
287
|
+
end
|
288
|
+
|
289
|
+
attr_reader :name, :rendered
|
290
|
+
end
|
291
|
+
|
292
|
+
def self.rule_info(name, rendered)
|
293
|
+
RuleInfo.new(name, rendered)
|
294
|
+
end
|
295
|
+
|
296
|
+
# STANDALONE END
|
297
|
+
|
298
|
+
end
|
299
|
+
end
|
@@ -0,0 +1,2440 @@
|
|
1
|
+
class KPeg::FormatParser
|
2
|
+
# STANDALONE START
|
3
|
+
def setup_parser(str, debug=false)
|
4
|
+
@string = str
|
5
|
+
@pos = 0
|
6
|
+
@memoizations = Hash.new { |h,k| h[k] = {} }
|
7
|
+
@result = nil
|
8
|
+
@failed_rule = nil
|
9
|
+
@failing_rule_offset = -1
|
10
|
+
|
11
|
+
setup_foreign_grammar
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup_foreign_grammar
|
15
|
+
end
|
16
|
+
|
17
|
+
# This is distinct from setup_parser so that a standalone parser
|
18
|
+
# can redefine #initialize and still have access to the proper
|
19
|
+
# parser setup code.
|
20
|
+
#
|
21
|
+
def initialize(str, debug=false)
|
22
|
+
setup_parser(str, debug)
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :string
|
26
|
+
attr_reader :result, :failing_rule_offset
|
27
|
+
attr_accessor :pos
|
28
|
+
|
29
|
+
# STANDALONE START
|
30
|
+
def current_column(target=pos)
|
31
|
+
if c = string.rindex("\n", target-1)
|
32
|
+
return target - c - 1
|
33
|
+
end
|
34
|
+
|
35
|
+
target + 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_line(target=pos)
|
39
|
+
cur_offset = 0
|
40
|
+
cur_line = 0
|
41
|
+
|
42
|
+
string.each_line do |line|
|
43
|
+
cur_line += 1
|
44
|
+
cur_offset += line.size
|
45
|
+
return cur_line if cur_offset >= target
|
46
|
+
end
|
47
|
+
|
48
|
+
-1
|
49
|
+
end
|
50
|
+
|
51
|
+
def lines
|
52
|
+
lines = []
|
53
|
+
string.each_line { |l| lines << l }
|
54
|
+
lines
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
|
59
|
+
def get_text(start)
|
60
|
+
@string[start..@pos-1]
|
61
|
+
end
|
62
|
+
|
63
|
+
def show_pos
|
64
|
+
width = 10
|
65
|
+
if @pos < width
|
66
|
+
"#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
|
67
|
+
else
|
68
|
+
"#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def failure_info
|
73
|
+
l = current_line @failing_rule_offset
|
74
|
+
c = current_column @failing_rule_offset
|
75
|
+
|
76
|
+
if @failed_rule.kind_of? Symbol
|
77
|
+
info = self.class::Rules[@failed_rule]
|
78
|
+
"line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
|
79
|
+
else
|
80
|
+
"line #{l}, column #{c}: failed rule '#{@failed_rule}'"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def failure_caret
|
85
|
+
l = current_line @failing_rule_offset
|
86
|
+
c = current_column @failing_rule_offset
|
87
|
+
|
88
|
+
line = lines[l-1]
|
89
|
+
"#{line}\n#{' ' * (c - 1)}^"
|
90
|
+
end
|
91
|
+
|
92
|
+
def failure_character
|
93
|
+
l = current_line @failing_rule_offset
|
94
|
+
c = current_column @failing_rule_offset
|
95
|
+
lines[l-1][c-1, 1]
|
96
|
+
end
|
97
|
+
|
98
|
+
def failure_oneline
|
99
|
+
l = current_line @failing_rule_offset
|
100
|
+
c = current_column @failing_rule_offset
|
101
|
+
|
102
|
+
char = lines[l-1][c-1, 1]
|
103
|
+
|
104
|
+
if @failed_rule.kind_of? Symbol
|
105
|
+
info = self.class::Rules[@failed_rule]
|
106
|
+
"@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
|
107
|
+
else
|
108
|
+
"@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ParseError < RuntimeError
|
113
|
+
end
|
114
|
+
|
115
|
+
def raise_error
|
116
|
+
raise ParseError, failure_oneline
|
117
|
+
end
|
118
|
+
|
119
|
+
def show_error(io=STDOUT)
|
120
|
+
error_pos = @failing_rule_offset
|
121
|
+
line_no = current_line(error_pos)
|
122
|
+
col_no = current_column(error_pos)
|
123
|
+
|
124
|
+
io.puts "On line #{line_no}, column #{col_no}:"
|
125
|
+
|
126
|
+
if @failed_rule.kind_of? Symbol
|
127
|
+
info = self.class::Rules[@failed_rule]
|
128
|
+
io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
|
129
|
+
else
|
130
|
+
io.puts "Failed to match rule '#{@failed_rule}'"
|
131
|
+
end
|
132
|
+
|
133
|
+
io.puts "Got: #{string[error_pos,1].inspect}"
|
134
|
+
line = lines[line_no-1]
|
135
|
+
io.puts "=> #{line}"
|
136
|
+
io.print(" " * (col_no + 3))
|
137
|
+
io.puts "^"
|
138
|
+
end
|
139
|
+
|
140
|
+
def set_failed_rule(name)
|
141
|
+
if @pos > @failing_rule_offset
|
142
|
+
@failed_rule = name
|
143
|
+
@failing_rule_offset = @pos
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
attr_reader :failed_rule
|
148
|
+
|
149
|
+
def match_string(str)
|
150
|
+
len = str.size
|
151
|
+
if @string[pos,len] == str
|
152
|
+
@pos += len
|
153
|
+
return str
|
154
|
+
end
|
155
|
+
|
156
|
+
return nil
|
157
|
+
end
|
158
|
+
|
159
|
+
def scan(reg)
|
160
|
+
if m = reg.match(@string[@pos..-1])
|
161
|
+
width = m.end(0)
|
162
|
+
@pos += width
|
163
|
+
return true
|
164
|
+
end
|
165
|
+
|
166
|
+
return nil
|
167
|
+
end
|
168
|
+
|
169
|
+
if "".respond_to? :getbyte
|
170
|
+
def get_byte
|
171
|
+
if @pos >= @string.size
|
172
|
+
return nil
|
173
|
+
end
|
174
|
+
|
175
|
+
s = @string.getbyte @pos
|
176
|
+
@pos += 1
|
177
|
+
s
|
178
|
+
end
|
179
|
+
else
|
180
|
+
def get_byte
|
181
|
+
if @pos >= @string.size
|
182
|
+
return nil
|
183
|
+
end
|
184
|
+
|
185
|
+
s = @string[@pos]
|
186
|
+
@pos += 1
|
187
|
+
s
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def parse(rule=nil)
|
192
|
+
if !rule
|
193
|
+
_root ? true : false
|
194
|
+
else
|
195
|
+
# This is not shared with code_generator.rb so this can be standalone
|
196
|
+
method = rule.gsub("-","_hyphen_")
|
197
|
+
__send__("_#{method}") ? true : false
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
class LeftRecursive
|
202
|
+
def initialize(detected=false)
|
203
|
+
@detected = detected
|
204
|
+
end
|
205
|
+
|
206
|
+
attr_accessor :detected
|
207
|
+
end
|
208
|
+
|
209
|
+
class MemoEntry
|
210
|
+
def initialize(ans, pos)
|
211
|
+
@ans = ans
|
212
|
+
@pos = pos
|
213
|
+
@uses = 1
|
214
|
+
@result = nil
|
215
|
+
end
|
216
|
+
|
217
|
+
attr_reader :ans, :pos, :uses, :result
|
218
|
+
|
219
|
+
def inc!
|
220
|
+
@uses += 1
|
221
|
+
end
|
222
|
+
|
223
|
+
def move!(ans, pos, result)
|
224
|
+
@ans = ans
|
225
|
+
@pos = pos
|
226
|
+
@result = result
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def external_invoke(other, rule, *args)
|
231
|
+
old_pos = @pos
|
232
|
+
old_string = @string
|
233
|
+
|
234
|
+
@pos = other.pos
|
235
|
+
@string = other.string
|
236
|
+
|
237
|
+
begin
|
238
|
+
if val = __send__(rule, *args)
|
239
|
+
other.pos = @pos
|
240
|
+
else
|
241
|
+
other.set_failed_rule "#{self.class}##{rule}"
|
242
|
+
end
|
243
|
+
val
|
244
|
+
ensure
|
245
|
+
@pos = old_pos
|
246
|
+
@string = old_string
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def apply(rule)
|
251
|
+
if m = @memoizations[rule][@pos]
|
252
|
+
m.inc!
|
253
|
+
|
254
|
+
prev = @pos
|
255
|
+
@pos = m.pos
|
256
|
+
if m.ans.kind_of? LeftRecursive
|
257
|
+
m.ans.detected = true
|
258
|
+
return nil
|
259
|
+
end
|
260
|
+
|
261
|
+
@result = m.result
|
262
|
+
|
263
|
+
return m.ans
|
264
|
+
else
|
265
|
+
lr = LeftRecursive.new(false)
|
266
|
+
m = MemoEntry.new(lr, @pos)
|
267
|
+
@memoizations[rule][@pos] = m
|
268
|
+
start_pos = @pos
|
269
|
+
|
270
|
+
ans = __send__ rule
|
271
|
+
|
272
|
+
m.move! ans, @pos, @result
|
273
|
+
|
274
|
+
# Don't bother trying to grow the left recursion
|
275
|
+
# if it's failing straight away (thus there is no seed)
|
276
|
+
if ans and lr.detected
|
277
|
+
return grow_lr(rule, start_pos, m)
|
278
|
+
else
|
279
|
+
return ans
|
280
|
+
end
|
281
|
+
|
282
|
+
return ans
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def grow_lr(rule, start_pos, m)
|
287
|
+
while true
|
288
|
+
@pos = start_pos
|
289
|
+
@result = m.result
|
290
|
+
|
291
|
+
ans = __send__ rule
|
292
|
+
return nil unless ans
|
293
|
+
|
294
|
+
break if @pos <= m.pos
|
295
|
+
|
296
|
+
m.move! ans, @pos, @result
|
297
|
+
end
|
298
|
+
|
299
|
+
@result = m.result
|
300
|
+
@pos = m.pos
|
301
|
+
return m.ans
|
302
|
+
end
|
303
|
+
|
304
|
+
class RuleInfo
|
305
|
+
def initialize(name, rendered)
|
306
|
+
@name = name
|
307
|
+
@rendered = rendered
|
308
|
+
end
|
309
|
+
|
310
|
+
attr_reader :name, :rendered
|
311
|
+
end
|
312
|
+
|
313
|
+
def self.rule_info(name, rendered)
|
314
|
+
RuleInfo.new(name, rendered)
|
315
|
+
end
|
316
|
+
|
317
|
+
#
|
318
|
+
|
319
|
+
|
320
|
+
require 'kpeg/grammar'
|
321
|
+
|
322
|
+
def initialize(str, debug=false)
|
323
|
+
setup_parser(str, debug)
|
324
|
+
@g = KPeg::Grammar.new
|
325
|
+
end
|
326
|
+
|
327
|
+
attr_reader :g
|
328
|
+
alias_method :grammar, :g
|
329
|
+
|
330
|
+
|
331
|
+
def setup_foreign_grammar; end
|
332
|
+
|
333
|
+
# eol = "\n"
|
334
|
+
def _eol
|
335
|
+
_tmp = match_string("\n")
|
336
|
+
set_failed_rule :_eol unless _tmp
|
337
|
+
return _tmp
|
338
|
+
end
|
339
|
+
|
340
|
+
# comment = "#" (!eol .)* eol
|
341
|
+
def _comment
|
342
|
+
|
343
|
+
_save = self.pos
|
344
|
+
while true # sequence
|
345
|
+
_tmp = match_string("#")
|
346
|
+
unless _tmp
|
347
|
+
self.pos = _save
|
348
|
+
break
|
349
|
+
end
|
350
|
+
while true
|
351
|
+
|
352
|
+
_save2 = self.pos
|
353
|
+
while true # sequence
|
354
|
+
_save3 = self.pos
|
355
|
+
_tmp = apply(:_eol)
|
356
|
+
_tmp = _tmp ? nil : true
|
357
|
+
self.pos = _save3
|
358
|
+
unless _tmp
|
359
|
+
self.pos = _save2
|
360
|
+
break
|
361
|
+
end
|
362
|
+
_tmp = get_byte
|
363
|
+
unless _tmp
|
364
|
+
self.pos = _save2
|
365
|
+
end
|
366
|
+
break
|
367
|
+
end # end sequence
|
368
|
+
|
369
|
+
break unless _tmp
|
370
|
+
end
|
371
|
+
_tmp = true
|
372
|
+
unless _tmp
|
373
|
+
self.pos = _save
|
374
|
+
break
|
375
|
+
end
|
376
|
+
_tmp = apply(:_eol)
|
377
|
+
unless _tmp
|
378
|
+
self.pos = _save
|
379
|
+
end
|
380
|
+
break
|
381
|
+
end # end sequence
|
382
|
+
|
383
|
+
set_failed_rule :_comment unless _tmp
|
384
|
+
return _tmp
|
385
|
+
end
|
386
|
+
|
387
|
+
# space = (" " | "\t" | eol)
|
388
|
+
def _space
|
389
|
+
|
390
|
+
_save = self.pos
|
391
|
+
while true # choice
|
392
|
+
_tmp = match_string(" ")
|
393
|
+
break if _tmp
|
394
|
+
self.pos = _save
|
395
|
+
_tmp = match_string("\t")
|
396
|
+
break if _tmp
|
397
|
+
self.pos = _save
|
398
|
+
_tmp = apply(:_eol)
|
399
|
+
break if _tmp
|
400
|
+
self.pos = _save
|
401
|
+
break
|
402
|
+
end # end choice
|
403
|
+
|
404
|
+
set_failed_rule :_space unless _tmp
|
405
|
+
return _tmp
|
406
|
+
end
|
407
|
+
|
408
|
+
# - = (space | comment)*
|
409
|
+
def __hyphen_
|
410
|
+
while true
|
411
|
+
|
412
|
+
_save1 = self.pos
|
413
|
+
while true # choice
|
414
|
+
_tmp = apply(:_space)
|
415
|
+
break if _tmp
|
416
|
+
self.pos = _save1
|
417
|
+
_tmp = apply(:_comment)
|
418
|
+
break if _tmp
|
419
|
+
self.pos = _save1
|
420
|
+
break
|
421
|
+
end # end choice
|
422
|
+
|
423
|
+
break unless _tmp
|
424
|
+
end
|
425
|
+
_tmp = true
|
426
|
+
set_failed_rule :__hyphen_ unless _tmp
|
427
|
+
return _tmp
|
428
|
+
end
|
429
|
+
|
430
|
+
# var = < ("-" | /[a-zA-Z][\-_a-zA-Z0-9]*/) > { text }
|
431
|
+
def _var
|
432
|
+
|
433
|
+
_save = self.pos
|
434
|
+
while true # sequence
|
435
|
+
_text_start = self.pos
|
436
|
+
|
437
|
+
_save1 = self.pos
|
438
|
+
while true # choice
|
439
|
+
_tmp = match_string("-")
|
440
|
+
break if _tmp
|
441
|
+
self.pos = _save1
|
442
|
+
_tmp = scan(/\A(?-mix:[a-zA-Z][\-_a-zA-Z0-9]*)/)
|
443
|
+
break if _tmp
|
444
|
+
self.pos = _save1
|
445
|
+
break
|
446
|
+
end # end choice
|
447
|
+
|
448
|
+
if _tmp
|
449
|
+
text = get_text(_text_start)
|
450
|
+
end
|
451
|
+
unless _tmp
|
452
|
+
self.pos = _save
|
453
|
+
break
|
454
|
+
end
|
455
|
+
@result = begin; text ; end
|
456
|
+
_tmp = true
|
457
|
+
unless _tmp
|
458
|
+
self.pos = _save
|
459
|
+
end
|
460
|
+
break
|
461
|
+
end # end sequence
|
462
|
+
|
463
|
+
set_failed_rule :_var unless _tmp
|
464
|
+
return _tmp
|
465
|
+
end
|
466
|
+
|
467
|
+
# dbl_escapes = ("\\\"" { '"' } | "\\n" { "\n" } | "\\t" { "\t" } | "\\b" { "\b" } | "\\\\" { "\\" })
|
468
|
+
def _dbl_escapes
|
469
|
+
|
470
|
+
_save = self.pos
|
471
|
+
while true # choice
|
472
|
+
|
473
|
+
_save1 = self.pos
|
474
|
+
while true # sequence
|
475
|
+
_tmp = match_string("\\\"")
|
476
|
+
unless _tmp
|
477
|
+
self.pos = _save1
|
478
|
+
break
|
479
|
+
end
|
480
|
+
@result = begin; '"' ; end
|
481
|
+
_tmp = true
|
482
|
+
unless _tmp
|
483
|
+
self.pos = _save1
|
484
|
+
end
|
485
|
+
break
|
486
|
+
end # end sequence
|
487
|
+
|
488
|
+
break if _tmp
|
489
|
+
self.pos = _save
|
490
|
+
|
491
|
+
_save2 = self.pos
|
492
|
+
while true # sequence
|
493
|
+
_tmp = match_string("\\n")
|
494
|
+
unless _tmp
|
495
|
+
self.pos = _save2
|
496
|
+
break
|
497
|
+
end
|
498
|
+
@result = begin; "\n" ; end
|
499
|
+
_tmp = true
|
500
|
+
unless _tmp
|
501
|
+
self.pos = _save2
|
502
|
+
end
|
503
|
+
break
|
504
|
+
end # end sequence
|
505
|
+
|
506
|
+
break if _tmp
|
507
|
+
self.pos = _save
|
508
|
+
|
509
|
+
_save3 = self.pos
|
510
|
+
while true # sequence
|
511
|
+
_tmp = match_string("\\t")
|
512
|
+
unless _tmp
|
513
|
+
self.pos = _save3
|
514
|
+
break
|
515
|
+
end
|
516
|
+
@result = begin; "\t" ; end
|
517
|
+
_tmp = true
|
518
|
+
unless _tmp
|
519
|
+
self.pos = _save3
|
520
|
+
end
|
521
|
+
break
|
522
|
+
end # end sequence
|
523
|
+
|
524
|
+
break if _tmp
|
525
|
+
self.pos = _save
|
526
|
+
|
527
|
+
_save4 = self.pos
|
528
|
+
while true # sequence
|
529
|
+
_tmp = match_string("\\b")
|
530
|
+
unless _tmp
|
531
|
+
self.pos = _save4
|
532
|
+
break
|
533
|
+
end
|
534
|
+
@result = begin; "\b" ; end
|
535
|
+
_tmp = true
|
536
|
+
unless _tmp
|
537
|
+
self.pos = _save4
|
538
|
+
end
|
539
|
+
break
|
540
|
+
end # end sequence
|
541
|
+
|
542
|
+
break if _tmp
|
543
|
+
self.pos = _save
|
544
|
+
|
545
|
+
_save5 = self.pos
|
546
|
+
while true # sequence
|
547
|
+
_tmp = match_string("\\\\")
|
548
|
+
unless _tmp
|
549
|
+
self.pos = _save5
|
550
|
+
break
|
551
|
+
end
|
552
|
+
@result = begin; "\\" ; end
|
553
|
+
_tmp = true
|
554
|
+
unless _tmp
|
555
|
+
self.pos = _save5
|
556
|
+
end
|
557
|
+
break
|
558
|
+
end # end sequence
|
559
|
+
|
560
|
+
break if _tmp
|
561
|
+
self.pos = _save
|
562
|
+
break
|
563
|
+
end # end choice
|
564
|
+
|
565
|
+
set_failed_rule :_dbl_escapes unless _tmp
|
566
|
+
return _tmp
|
567
|
+
end
|
568
|
+
|
569
|
+
# dbl_seq = < /[^\\"]+/ > { text }
|
570
|
+
def _dbl_seq
|
571
|
+
|
572
|
+
_save = self.pos
|
573
|
+
while true # sequence
|
574
|
+
_text_start = self.pos
|
575
|
+
_tmp = scan(/\A(?-mix:[^\\"]+)/)
|
576
|
+
if _tmp
|
577
|
+
text = get_text(_text_start)
|
578
|
+
end
|
579
|
+
unless _tmp
|
580
|
+
self.pos = _save
|
581
|
+
break
|
582
|
+
end
|
583
|
+
@result = begin; text ; end
|
584
|
+
_tmp = true
|
585
|
+
unless _tmp
|
586
|
+
self.pos = _save
|
587
|
+
end
|
588
|
+
break
|
589
|
+
end # end sequence
|
590
|
+
|
591
|
+
set_failed_rule :_dbl_seq unless _tmp
|
592
|
+
return _tmp
|
593
|
+
end
|
594
|
+
|
595
|
+
# dbl_not_quote = (dbl_escapes:s | dbl_seq:s)+:ary { ary }
|
596
|
+
def _dbl_not_quote
|
597
|
+
|
598
|
+
_save = self.pos
|
599
|
+
while true # sequence
|
600
|
+
_save1 = self.pos
|
601
|
+
_ary = []
|
602
|
+
|
603
|
+
_save2 = self.pos
|
604
|
+
while true # choice
|
605
|
+
_tmp = apply(:_dbl_escapes)
|
606
|
+
s = @result
|
607
|
+
break if _tmp
|
608
|
+
self.pos = _save2
|
609
|
+
_tmp = apply(:_dbl_seq)
|
610
|
+
s = @result
|
611
|
+
break if _tmp
|
612
|
+
self.pos = _save2
|
613
|
+
break
|
614
|
+
end # end choice
|
615
|
+
|
616
|
+
if _tmp
|
617
|
+
_ary << @result
|
618
|
+
while true
|
619
|
+
|
620
|
+
_save3 = self.pos
|
621
|
+
while true # choice
|
622
|
+
_tmp = apply(:_dbl_escapes)
|
623
|
+
s = @result
|
624
|
+
break if _tmp
|
625
|
+
self.pos = _save3
|
626
|
+
_tmp = apply(:_dbl_seq)
|
627
|
+
s = @result
|
628
|
+
break if _tmp
|
629
|
+
self.pos = _save3
|
630
|
+
break
|
631
|
+
end # end choice
|
632
|
+
|
633
|
+
_ary << @result if _tmp
|
634
|
+
break unless _tmp
|
635
|
+
end
|
636
|
+
_tmp = true
|
637
|
+
@result = _ary
|
638
|
+
else
|
639
|
+
self.pos = _save1
|
640
|
+
end
|
641
|
+
ary = @result
|
642
|
+
unless _tmp
|
643
|
+
self.pos = _save
|
644
|
+
break
|
645
|
+
end
|
646
|
+
@result = begin; ary ; end
|
647
|
+
_tmp = true
|
648
|
+
unless _tmp
|
649
|
+
self.pos = _save
|
650
|
+
end
|
651
|
+
break
|
652
|
+
end # end sequence
|
653
|
+
|
654
|
+
set_failed_rule :_dbl_not_quote unless _tmp
|
655
|
+
return _tmp
|
656
|
+
end
|
657
|
+
|
658
|
+
# dbl_string = "\"" dbl_not_quote:s "\"" { @g.str(s.join) }
|
659
|
+
def _dbl_string
|
660
|
+
|
661
|
+
_save = self.pos
|
662
|
+
while true # sequence
|
663
|
+
_tmp = match_string("\"")
|
664
|
+
unless _tmp
|
665
|
+
self.pos = _save
|
666
|
+
break
|
667
|
+
end
|
668
|
+
_tmp = apply(:_dbl_not_quote)
|
669
|
+
s = @result
|
670
|
+
unless _tmp
|
671
|
+
self.pos = _save
|
672
|
+
break
|
673
|
+
end
|
674
|
+
_tmp = match_string("\"")
|
675
|
+
unless _tmp
|
676
|
+
self.pos = _save
|
677
|
+
break
|
678
|
+
end
|
679
|
+
@result = begin; @g.str(s.join) ; end
|
680
|
+
_tmp = true
|
681
|
+
unless _tmp
|
682
|
+
self.pos = _save
|
683
|
+
end
|
684
|
+
break
|
685
|
+
end # end sequence
|
686
|
+
|
687
|
+
set_failed_rule :_dbl_string unless _tmp
|
688
|
+
return _tmp
|
689
|
+
end
|
690
|
+
|
691
|
+
# sgl_escape_quote = "\\'" { "'" }
|
692
|
+
def _sgl_escape_quote
|
693
|
+
|
694
|
+
_save = self.pos
|
695
|
+
while true # sequence
|
696
|
+
_tmp = match_string("\\'")
|
697
|
+
unless _tmp
|
698
|
+
self.pos = _save
|
699
|
+
break
|
700
|
+
end
|
701
|
+
@result = begin; "'" ; end
|
702
|
+
_tmp = true
|
703
|
+
unless _tmp
|
704
|
+
self.pos = _save
|
705
|
+
end
|
706
|
+
break
|
707
|
+
end # end sequence
|
708
|
+
|
709
|
+
set_failed_rule :_sgl_escape_quote unless _tmp
|
710
|
+
return _tmp
|
711
|
+
end
|
712
|
+
|
713
|
+
# sgl_seq = < /[^']/ > { text }
|
714
|
+
def _sgl_seq
|
715
|
+
|
716
|
+
_save = self.pos
|
717
|
+
while true # sequence
|
718
|
+
_text_start = self.pos
|
719
|
+
_tmp = scan(/\A(?-mix:[^'])/)
|
720
|
+
if _tmp
|
721
|
+
text = get_text(_text_start)
|
722
|
+
end
|
723
|
+
unless _tmp
|
724
|
+
self.pos = _save
|
725
|
+
break
|
726
|
+
end
|
727
|
+
@result = begin; text ; end
|
728
|
+
_tmp = true
|
729
|
+
unless _tmp
|
730
|
+
self.pos = _save
|
731
|
+
end
|
732
|
+
break
|
733
|
+
end # end sequence
|
734
|
+
|
735
|
+
set_failed_rule :_sgl_seq unless _tmp
|
736
|
+
return _tmp
|
737
|
+
end
|
738
|
+
|
739
|
+
# sgl_not_quote = (sgl_escape_quote | sgl_seq)+:segs { segs.join }
|
740
|
+
def _sgl_not_quote
|
741
|
+
|
742
|
+
_save = self.pos
|
743
|
+
while true # sequence
|
744
|
+
_save1 = self.pos
|
745
|
+
_ary = []
|
746
|
+
|
747
|
+
_save2 = self.pos
|
748
|
+
while true # choice
|
749
|
+
_tmp = apply(:_sgl_escape_quote)
|
750
|
+
break if _tmp
|
751
|
+
self.pos = _save2
|
752
|
+
_tmp = apply(:_sgl_seq)
|
753
|
+
break if _tmp
|
754
|
+
self.pos = _save2
|
755
|
+
break
|
756
|
+
end # end choice
|
757
|
+
|
758
|
+
if _tmp
|
759
|
+
_ary << @result
|
760
|
+
while true
|
761
|
+
|
762
|
+
_save3 = self.pos
|
763
|
+
while true # choice
|
764
|
+
_tmp = apply(:_sgl_escape_quote)
|
765
|
+
break if _tmp
|
766
|
+
self.pos = _save3
|
767
|
+
_tmp = apply(:_sgl_seq)
|
768
|
+
break if _tmp
|
769
|
+
self.pos = _save3
|
770
|
+
break
|
771
|
+
end # end choice
|
772
|
+
|
773
|
+
_ary << @result if _tmp
|
774
|
+
break unless _tmp
|
775
|
+
end
|
776
|
+
_tmp = true
|
777
|
+
@result = _ary
|
778
|
+
else
|
779
|
+
self.pos = _save1
|
780
|
+
end
|
781
|
+
segs = @result
|
782
|
+
unless _tmp
|
783
|
+
self.pos = _save
|
784
|
+
break
|
785
|
+
end
|
786
|
+
@result = begin; segs.join ; end
|
787
|
+
_tmp = true
|
788
|
+
unless _tmp
|
789
|
+
self.pos = _save
|
790
|
+
end
|
791
|
+
break
|
792
|
+
end # end sequence
|
793
|
+
|
794
|
+
set_failed_rule :_sgl_not_quote unless _tmp
|
795
|
+
return _tmp
|
796
|
+
end
|
797
|
+
|
798
|
+
# sgl_string = "'" sgl_not_quote:s "'" { @g.str(s) }
|
799
|
+
def _sgl_string
|
800
|
+
|
801
|
+
_save = self.pos
|
802
|
+
while true # sequence
|
803
|
+
_tmp = match_string("'")
|
804
|
+
unless _tmp
|
805
|
+
self.pos = _save
|
806
|
+
break
|
807
|
+
end
|
808
|
+
_tmp = apply(:_sgl_not_quote)
|
809
|
+
s = @result
|
810
|
+
unless _tmp
|
811
|
+
self.pos = _save
|
812
|
+
break
|
813
|
+
end
|
814
|
+
_tmp = match_string("'")
|
815
|
+
unless _tmp
|
816
|
+
self.pos = _save
|
817
|
+
break
|
818
|
+
end
|
819
|
+
@result = begin; @g.str(s) ; end
|
820
|
+
_tmp = true
|
821
|
+
unless _tmp
|
822
|
+
self.pos = _save
|
823
|
+
end
|
824
|
+
break
|
825
|
+
end # end sequence
|
826
|
+
|
827
|
+
set_failed_rule :_sgl_string unless _tmp
|
828
|
+
return _tmp
|
829
|
+
end
|
830
|
+
|
831
|
+
# string = (dbl_string | sgl_string)
|
832
|
+
def _string
|
833
|
+
|
834
|
+
_save = self.pos
|
835
|
+
while true # choice
|
836
|
+
_tmp = apply(:_dbl_string)
|
837
|
+
break if _tmp
|
838
|
+
self.pos = _save
|
839
|
+
_tmp = apply(:_sgl_string)
|
840
|
+
break if _tmp
|
841
|
+
self.pos = _save
|
842
|
+
break
|
843
|
+
end # end choice
|
844
|
+
|
845
|
+
set_failed_rule :_string unless _tmp
|
846
|
+
return _tmp
|
847
|
+
end
|
848
|
+
|
849
|
+
# not_slash = < ("\\/" | /[^\/]/)+ > { text }
|
850
|
+
def _not_slash
|
851
|
+
|
852
|
+
_save = self.pos
|
853
|
+
while true # sequence
|
854
|
+
_text_start = self.pos
|
855
|
+
_save1 = self.pos
|
856
|
+
|
857
|
+
_save2 = self.pos
|
858
|
+
while true # choice
|
859
|
+
_tmp = match_string("\\/")
|
860
|
+
break if _tmp
|
861
|
+
self.pos = _save2
|
862
|
+
_tmp = scan(/\A(?-mix:[^\/])/)
|
863
|
+
break if _tmp
|
864
|
+
self.pos = _save2
|
865
|
+
break
|
866
|
+
end # end choice
|
867
|
+
|
868
|
+
if _tmp
|
869
|
+
while true
|
870
|
+
|
871
|
+
_save3 = self.pos
|
872
|
+
while true # choice
|
873
|
+
_tmp = match_string("\\/")
|
874
|
+
break if _tmp
|
875
|
+
self.pos = _save3
|
876
|
+
_tmp = scan(/\A(?-mix:[^\/])/)
|
877
|
+
break if _tmp
|
878
|
+
self.pos = _save3
|
879
|
+
break
|
880
|
+
end # end choice
|
881
|
+
|
882
|
+
break unless _tmp
|
883
|
+
end
|
884
|
+
_tmp = true
|
885
|
+
else
|
886
|
+
self.pos = _save1
|
887
|
+
end
|
888
|
+
if _tmp
|
889
|
+
text = get_text(_text_start)
|
890
|
+
end
|
891
|
+
unless _tmp
|
892
|
+
self.pos = _save
|
893
|
+
break
|
894
|
+
end
|
895
|
+
@result = begin; text ; end
|
896
|
+
_tmp = true
|
897
|
+
unless _tmp
|
898
|
+
self.pos = _save
|
899
|
+
end
|
900
|
+
break
|
901
|
+
end # end sequence
|
902
|
+
|
903
|
+
set_failed_rule :_not_slash unless _tmp
|
904
|
+
return _tmp
|
905
|
+
end
|
906
|
+
|
907
|
+
# regexp_opts = < [a-z]* > { text }
|
908
|
+
def _regexp_opts
|
909
|
+
|
910
|
+
_save = self.pos
|
911
|
+
while true # sequence
|
912
|
+
_text_start = self.pos
|
913
|
+
while true
|
914
|
+
_save2 = self.pos
|
915
|
+
_tmp = get_byte
|
916
|
+
if _tmp
|
917
|
+
unless _tmp >= 97 and _tmp <= 122
|
918
|
+
self.pos = _save2
|
919
|
+
_tmp = nil
|
920
|
+
end
|
921
|
+
end
|
922
|
+
break unless _tmp
|
923
|
+
end
|
924
|
+
_tmp = true
|
925
|
+
if _tmp
|
926
|
+
text = get_text(_text_start)
|
927
|
+
end
|
928
|
+
unless _tmp
|
929
|
+
self.pos = _save
|
930
|
+
break
|
931
|
+
end
|
932
|
+
@result = begin; text ; end
|
933
|
+
_tmp = true
|
934
|
+
unless _tmp
|
935
|
+
self.pos = _save
|
936
|
+
end
|
937
|
+
break
|
938
|
+
end # end sequence
|
939
|
+
|
940
|
+
set_failed_rule :_regexp_opts unless _tmp
|
941
|
+
return _tmp
|
942
|
+
end
|
943
|
+
|
944
|
+
# regexp = "/" not_slash:body "/" regexp_opts:opts { @g.reg body, opts }
|
945
|
+
def _regexp
|
946
|
+
|
947
|
+
_save = self.pos
|
948
|
+
while true # sequence
|
949
|
+
_tmp = match_string("/")
|
950
|
+
unless _tmp
|
951
|
+
self.pos = _save
|
952
|
+
break
|
953
|
+
end
|
954
|
+
_tmp = apply(:_not_slash)
|
955
|
+
body = @result
|
956
|
+
unless _tmp
|
957
|
+
self.pos = _save
|
958
|
+
break
|
959
|
+
end
|
960
|
+
_tmp = match_string("/")
|
961
|
+
unless _tmp
|
962
|
+
self.pos = _save
|
963
|
+
break
|
964
|
+
end
|
965
|
+
_tmp = apply(:_regexp_opts)
|
966
|
+
opts = @result
|
967
|
+
unless _tmp
|
968
|
+
self.pos = _save
|
969
|
+
break
|
970
|
+
end
|
971
|
+
@result = begin; @g.reg body, opts ; end
|
972
|
+
_tmp = true
|
973
|
+
unless _tmp
|
974
|
+
self.pos = _save
|
975
|
+
end
|
976
|
+
break
|
977
|
+
end # end sequence
|
978
|
+
|
979
|
+
set_failed_rule :_regexp unless _tmp
|
980
|
+
return _tmp
|
981
|
+
end
|
982
|
+
|
983
|
+
# char = < /[a-zA-Z0-9]/ > { text }
|
984
|
+
def _char
|
985
|
+
|
986
|
+
_save = self.pos
|
987
|
+
while true # sequence
|
988
|
+
_text_start = self.pos
|
989
|
+
_tmp = scan(/\A(?-mix:[a-zA-Z0-9])/)
|
990
|
+
if _tmp
|
991
|
+
text = get_text(_text_start)
|
992
|
+
end
|
993
|
+
unless _tmp
|
994
|
+
self.pos = _save
|
995
|
+
break
|
996
|
+
end
|
997
|
+
@result = begin; text ; end
|
998
|
+
_tmp = true
|
999
|
+
unless _tmp
|
1000
|
+
self.pos = _save
|
1001
|
+
end
|
1002
|
+
break
|
1003
|
+
end # end sequence
|
1004
|
+
|
1005
|
+
set_failed_rule :_char unless _tmp
|
1006
|
+
return _tmp
|
1007
|
+
end
|
1008
|
+
|
1009
|
+
# char_range = "[" char:l "-" char:r "]" { @g.range(l,r) }
|
1010
|
+
def _char_range
|
1011
|
+
|
1012
|
+
_save = self.pos
|
1013
|
+
while true # sequence
|
1014
|
+
_tmp = match_string("[")
|
1015
|
+
unless _tmp
|
1016
|
+
self.pos = _save
|
1017
|
+
break
|
1018
|
+
end
|
1019
|
+
_tmp = apply(:_char)
|
1020
|
+
l = @result
|
1021
|
+
unless _tmp
|
1022
|
+
self.pos = _save
|
1023
|
+
break
|
1024
|
+
end
|
1025
|
+
_tmp = match_string("-")
|
1026
|
+
unless _tmp
|
1027
|
+
self.pos = _save
|
1028
|
+
break
|
1029
|
+
end
|
1030
|
+
_tmp = apply(:_char)
|
1031
|
+
r = @result
|
1032
|
+
unless _tmp
|
1033
|
+
self.pos = _save
|
1034
|
+
break
|
1035
|
+
end
|
1036
|
+
_tmp = match_string("]")
|
1037
|
+
unless _tmp
|
1038
|
+
self.pos = _save
|
1039
|
+
break
|
1040
|
+
end
|
1041
|
+
@result = begin; @g.range(l,r) ; end
|
1042
|
+
_tmp = true
|
1043
|
+
unless _tmp
|
1044
|
+
self.pos = _save
|
1045
|
+
end
|
1046
|
+
break
|
1047
|
+
end # end sequence
|
1048
|
+
|
1049
|
+
set_failed_rule :_char_range unless _tmp
|
1050
|
+
return _tmp
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
# range_elem = < /([1-9][0-9]*)|\*/ > { text }
|
1054
|
+
def _range_elem
|
1055
|
+
|
1056
|
+
_save = self.pos
|
1057
|
+
while true # sequence
|
1058
|
+
_text_start = self.pos
|
1059
|
+
_tmp = scan(/\A(?-mix:([1-9][0-9]*)|\*)/)
|
1060
|
+
if _tmp
|
1061
|
+
text = get_text(_text_start)
|
1062
|
+
end
|
1063
|
+
unless _tmp
|
1064
|
+
self.pos = _save
|
1065
|
+
break
|
1066
|
+
end
|
1067
|
+
@result = begin; text ; end
|
1068
|
+
_tmp = true
|
1069
|
+
unless _tmp
|
1070
|
+
self.pos = _save
|
1071
|
+
end
|
1072
|
+
break
|
1073
|
+
end # end sequence
|
1074
|
+
|
1075
|
+
set_failed_rule :_range_elem unless _tmp
|
1076
|
+
return _tmp
|
1077
|
+
end
|
1078
|
+
|
1079
|
+
# mult_range = "[" - range_elem:l - "," - range_elem:r - "]" { [l == "*" ? nil : l.to_i, r == "*" ? nil : r.to_i] }
|
1080
|
+
def _mult_range
|
1081
|
+
|
1082
|
+
_save = self.pos
|
1083
|
+
while true # sequence
|
1084
|
+
_tmp = match_string("[")
|
1085
|
+
unless _tmp
|
1086
|
+
self.pos = _save
|
1087
|
+
break
|
1088
|
+
end
|
1089
|
+
_tmp = apply(:__hyphen_)
|
1090
|
+
unless _tmp
|
1091
|
+
self.pos = _save
|
1092
|
+
break
|
1093
|
+
end
|
1094
|
+
_tmp = apply(:_range_elem)
|
1095
|
+
l = @result
|
1096
|
+
unless _tmp
|
1097
|
+
self.pos = _save
|
1098
|
+
break
|
1099
|
+
end
|
1100
|
+
_tmp = apply(:__hyphen_)
|
1101
|
+
unless _tmp
|
1102
|
+
self.pos = _save
|
1103
|
+
break
|
1104
|
+
end
|
1105
|
+
_tmp = match_string(",")
|
1106
|
+
unless _tmp
|
1107
|
+
self.pos = _save
|
1108
|
+
break
|
1109
|
+
end
|
1110
|
+
_tmp = apply(:__hyphen_)
|
1111
|
+
unless _tmp
|
1112
|
+
self.pos = _save
|
1113
|
+
break
|
1114
|
+
end
|
1115
|
+
_tmp = apply(:_range_elem)
|
1116
|
+
r = @result
|
1117
|
+
unless _tmp
|
1118
|
+
self.pos = _save
|
1119
|
+
break
|
1120
|
+
end
|
1121
|
+
_tmp = apply(:__hyphen_)
|
1122
|
+
unless _tmp
|
1123
|
+
self.pos = _save
|
1124
|
+
break
|
1125
|
+
end
|
1126
|
+
_tmp = match_string("]")
|
1127
|
+
unless _tmp
|
1128
|
+
self.pos = _save
|
1129
|
+
break
|
1130
|
+
end
|
1131
|
+
@result = begin; [l == "*" ? nil : l.to_i, r == "*" ? nil : r.to_i] ; end
|
1132
|
+
_tmp = true
|
1133
|
+
unless _tmp
|
1134
|
+
self.pos = _save
|
1135
|
+
end
|
1136
|
+
break
|
1137
|
+
end # end sequence
|
1138
|
+
|
1139
|
+
set_failed_rule :_mult_range unless _tmp
|
1140
|
+
return _tmp
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
# curly_block = curly
|
1144
|
+
def _curly_block
|
1145
|
+
_tmp = apply(:_curly)
|
1146
|
+
set_failed_rule :_curly_block unless _tmp
|
1147
|
+
return _tmp
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
# curly = "{" < (/[^{}]+/ | curly)* > "}" { @g.action(text) }
|
1151
|
+
def _curly
|
1152
|
+
|
1153
|
+
_save = self.pos
|
1154
|
+
while true # sequence
|
1155
|
+
_tmp = match_string("{")
|
1156
|
+
unless _tmp
|
1157
|
+
self.pos = _save
|
1158
|
+
break
|
1159
|
+
end
|
1160
|
+
_text_start = self.pos
|
1161
|
+
while true
|
1162
|
+
|
1163
|
+
_save2 = self.pos
|
1164
|
+
while true # choice
|
1165
|
+
_tmp = scan(/\A(?-mix:[^{}]+)/)
|
1166
|
+
break if _tmp
|
1167
|
+
self.pos = _save2
|
1168
|
+
_tmp = apply(:_curly)
|
1169
|
+
break if _tmp
|
1170
|
+
self.pos = _save2
|
1171
|
+
break
|
1172
|
+
end # end choice
|
1173
|
+
|
1174
|
+
break unless _tmp
|
1175
|
+
end
|
1176
|
+
_tmp = true
|
1177
|
+
if _tmp
|
1178
|
+
text = get_text(_text_start)
|
1179
|
+
end
|
1180
|
+
unless _tmp
|
1181
|
+
self.pos = _save
|
1182
|
+
break
|
1183
|
+
end
|
1184
|
+
_tmp = match_string("}")
|
1185
|
+
unless _tmp
|
1186
|
+
self.pos = _save
|
1187
|
+
break
|
1188
|
+
end
|
1189
|
+
@result = begin; @g.action(text) ; end
|
1190
|
+
_tmp = true
|
1191
|
+
unless _tmp
|
1192
|
+
self.pos = _save
|
1193
|
+
end
|
1194
|
+
break
|
1195
|
+
end # end sequence
|
1196
|
+
|
1197
|
+
set_failed_rule :_curly unless _tmp
|
1198
|
+
return _tmp
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
# nested_paren = "(" (/[^()]+/ | nested_paren)* ")"
|
1202
|
+
def _nested_paren
|
1203
|
+
|
1204
|
+
_save = self.pos
|
1205
|
+
while true # sequence
|
1206
|
+
_tmp = match_string("(")
|
1207
|
+
unless _tmp
|
1208
|
+
self.pos = _save
|
1209
|
+
break
|
1210
|
+
end
|
1211
|
+
while true
|
1212
|
+
|
1213
|
+
_save2 = self.pos
|
1214
|
+
while true # choice
|
1215
|
+
_tmp = scan(/\A(?-mix:[^()]+)/)
|
1216
|
+
break if _tmp
|
1217
|
+
self.pos = _save2
|
1218
|
+
_tmp = apply(:_nested_paren)
|
1219
|
+
break if _tmp
|
1220
|
+
self.pos = _save2
|
1221
|
+
break
|
1222
|
+
end # end choice
|
1223
|
+
|
1224
|
+
break unless _tmp
|
1225
|
+
end
|
1226
|
+
_tmp = true
|
1227
|
+
unless _tmp
|
1228
|
+
self.pos = _save
|
1229
|
+
break
|
1230
|
+
end
|
1231
|
+
_tmp = match_string(")")
|
1232
|
+
unless _tmp
|
1233
|
+
self.pos = _save
|
1234
|
+
end
|
1235
|
+
break
|
1236
|
+
end # end sequence
|
1237
|
+
|
1238
|
+
set_failed_rule :_nested_paren unless _tmp
|
1239
|
+
return _tmp
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
# value = (value:v ":" var:n { @g.t(v,n) } | value:v "?" { @g.maybe(v) } | value:v "+" { @g.many(v) } | value:v "*" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | "&" value:v { @g.andp(v) } | "!" value:v { @g.notp(v) } | "(" - expression:o - ")" { o } | "<" - expression:o - ">" { @g.collect(o) } | curly_block | "." { @g.dot } | "@" var:name !(- "=") { @g.invoke(name) } | "^" var:name < nested_paren? > { @g.foreign_invoke("parent", name, text) } | "%" var:gram "." var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- "=") { text.empty? ? @g.ref(name) : @g.invoke(name, text) } | char_range | regexp | string)
|
1243
|
+
def _value
|
1244
|
+
|
1245
|
+
_save = self.pos
|
1246
|
+
while true # choice
|
1247
|
+
|
1248
|
+
_save1 = self.pos
|
1249
|
+
while true # sequence
|
1250
|
+
_tmp = apply(:_value)
|
1251
|
+
v = @result
|
1252
|
+
unless _tmp
|
1253
|
+
self.pos = _save1
|
1254
|
+
break
|
1255
|
+
end
|
1256
|
+
_tmp = match_string(":")
|
1257
|
+
unless _tmp
|
1258
|
+
self.pos = _save1
|
1259
|
+
break
|
1260
|
+
end
|
1261
|
+
_tmp = apply(:_var)
|
1262
|
+
n = @result
|
1263
|
+
unless _tmp
|
1264
|
+
self.pos = _save1
|
1265
|
+
break
|
1266
|
+
end
|
1267
|
+
@result = begin; @g.t(v,n) ; end
|
1268
|
+
_tmp = true
|
1269
|
+
unless _tmp
|
1270
|
+
self.pos = _save1
|
1271
|
+
end
|
1272
|
+
break
|
1273
|
+
end # end sequence
|
1274
|
+
|
1275
|
+
break if _tmp
|
1276
|
+
self.pos = _save
|
1277
|
+
|
1278
|
+
_save2 = self.pos
|
1279
|
+
while true # sequence
|
1280
|
+
_tmp = apply(:_value)
|
1281
|
+
v = @result
|
1282
|
+
unless _tmp
|
1283
|
+
self.pos = _save2
|
1284
|
+
break
|
1285
|
+
end
|
1286
|
+
_tmp = match_string("?")
|
1287
|
+
unless _tmp
|
1288
|
+
self.pos = _save2
|
1289
|
+
break
|
1290
|
+
end
|
1291
|
+
@result = begin; @g.maybe(v) ; end
|
1292
|
+
_tmp = true
|
1293
|
+
unless _tmp
|
1294
|
+
self.pos = _save2
|
1295
|
+
end
|
1296
|
+
break
|
1297
|
+
end # end sequence
|
1298
|
+
|
1299
|
+
break if _tmp
|
1300
|
+
self.pos = _save
|
1301
|
+
|
1302
|
+
_save3 = self.pos
|
1303
|
+
while true # sequence
|
1304
|
+
_tmp = apply(:_value)
|
1305
|
+
v = @result
|
1306
|
+
unless _tmp
|
1307
|
+
self.pos = _save3
|
1308
|
+
break
|
1309
|
+
end
|
1310
|
+
_tmp = match_string("+")
|
1311
|
+
unless _tmp
|
1312
|
+
self.pos = _save3
|
1313
|
+
break
|
1314
|
+
end
|
1315
|
+
@result = begin; @g.many(v) ; end
|
1316
|
+
_tmp = true
|
1317
|
+
unless _tmp
|
1318
|
+
self.pos = _save3
|
1319
|
+
end
|
1320
|
+
break
|
1321
|
+
end # end sequence
|
1322
|
+
|
1323
|
+
break if _tmp
|
1324
|
+
self.pos = _save
|
1325
|
+
|
1326
|
+
_save4 = self.pos
|
1327
|
+
while true # sequence
|
1328
|
+
_tmp = apply(:_value)
|
1329
|
+
v = @result
|
1330
|
+
unless _tmp
|
1331
|
+
self.pos = _save4
|
1332
|
+
break
|
1333
|
+
end
|
1334
|
+
_tmp = match_string("*")
|
1335
|
+
unless _tmp
|
1336
|
+
self.pos = _save4
|
1337
|
+
break
|
1338
|
+
end
|
1339
|
+
@result = begin; @g.kleene(v) ; end
|
1340
|
+
_tmp = true
|
1341
|
+
unless _tmp
|
1342
|
+
self.pos = _save4
|
1343
|
+
end
|
1344
|
+
break
|
1345
|
+
end # end sequence
|
1346
|
+
|
1347
|
+
break if _tmp
|
1348
|
+
self.pos = _save
|
1349
|
+
|
1350
|
+
_save5 = self.pos
|
1351
|
+
while true # sequence
|
1352
|
+
_tmp = apply(:_value)
|
1353
|
+
v = @result
|
1354
|
+
unless _tmp
|
1355
|
+
self.pos = _save5
|
1356
|
+
break
|
1357
|
+
end
|
1358
|
+
_tmp = apply(:_mult_range)
|
1359
|
+
r = @result
|
1360
|
+
unless _tmp
|
1361
|
+
self.pos = _save5
|
1362
|
+
break
|
1363
|
+
end
|
1364
|
+
@result = begin; @g.multiple(v, *r) ; end
|
1365
|
+
_tmp = true
|
1366
|
+
unless _tmp
|
1367
|
+
self.pos = _save5
|
1368
|
+
end
|
1369
|
+
break
|
1370
|
+
end # end sequence
|
1371
|
+
|
1372
|
+
break if _tmp
|
1373
|
+
self.pos = _save
|
1374
|
+
|
1375
|
+
_save6 = self.pos
|
1376
|
+
while true # sequence
|
1377
|
+
_tmp = match_string("&")
|
1378
|
+
unless _tmp
|
1379
|
+
self.pos = _save6
|
1380
|
+
break
|
1381
|
+
end
|
1382
|
+
_tmp = apply(:_value)
|
1383
|
+
v = @result
|
1384
|
+
unless _tmp
|
1385
|
+
self.pos = _save6
|
1386
|
+
break
|
1387
|
+
end
|
1388
|
+
@result = begin; @g.andp(v) ; end
|
1389
|
+
_tmp = true
|
1390
|
+
unless _tmp
|
1391
|
+
self.pos = _save6
|
1392
|
+
end
|
1393
|
+
break
|
1394
|
+
end # end sequence
|
1395
|
+
|
1396
|
+
break if _tmp
|
1397
|
+
self.pos = _save
|
1398
|
+
|
1399
|
+
_save7 = self.pos
|
1400
|
+
while true # sequence
|
1401
|
+
_tmp = match_string("!")
|
1402
|
+
unless _tmp
|
1403
|
+
self.pos = _save7
|
1404
|
+
break
|
1405
|
+
end
|
1406
|
+
_tmp = apply(:_value)
|
1407
|
+
v = @result
|
1408
|
+
unless _tmp
|
1409
|
+
self.pos = _save7
|
1410
|
+
break
|
1411
|
+
end
|
1412
|
+
@result = begin; @g.notp(v) ; end
|
1413
|
+
_tmp = true
|
1414
|
+
unless _tmp
|
1415
|
+
self.pos = _save7
|
1416
|
+
end
|
1417
|
+
break
|
1418
|
+
end # end sequence
|
1419
|
+
|
1420
|
+
break if _tmp
|
1421
|
+
self.pos = _save
|
1422
|
+
|
1423
|
+
_save8 = self.pos
|
1424
|
+
while true # sequence
|
1425
|
+
_tmp = match_string("(")
|
1426
|
+
unless _tmp
|
1427
|
+
self.pos = _save8
|
1428
|
+
break
|
1429
|
+
end
|
1430
|
+
_tmp = apply(:__hyphen_)
|
1431
|
+
unless _tmp
|
1432
|
+
self.pos = _save8
|
1433
|
+
break
|
1434
|
+
end
|
1435
|
+
_tmp = apply(:_expression)
|
1436
|
+
o = @result
|
1437
|
+
unless _tmp
|
1438
|
+
self.pos = _save8
|
1439
|
+
break
|
1440
|
+
end
|
1441
|
+
_tmp = apply(:__hyphen_)
|
1442
|
+
unless _tmp
|
1443
|
+
self.pos = _save8
|
1444
|
+
break
|
1445
|
+
end
|
1446
|
+
_tmp = match_string(")")
|
1447
|
+
unless _tmp
|
1448
|
+
self.pos = _save8
|
1449
|
+
break
|
1450
|
+
end
|
1451
|
+
@result = begin; o ; end
|
1452
|
+
_tmp = true
|
1453
|
+
unless _tmp
|
1454
|
+
self.pos = _save8
|
1455
|
+
end
|
1456
|
+
break
|
1457
|
+
end # end sequence
|
1458
|
+
|
1459
|
+
break if _tmp
|
1460
|
+
self.pos = _save
|
1461
|
+
|
1462
|
+
_save9 = self.pos
|
1463
|
+
while true # sequence
|
1464
|
+
_tmp = match_string("<")
|
1465
|
+
unless _tmp
|
1466
|
+
self.pos = _save9
|
1467
|
+
break
|
1468
|
+
end
|
1469
|
+
_tmp = apply(:__hyphen_)
|
1470
|
+
unless _tmp
|
1471
|
+
self.pos = _save9
|
1472
|
+
break
|
1473
|
+
end
|
1474
|
+
_tmp = apply(:_expression)
|
1475
|
+
o = @result
|
1476
|
+
unless _tmp
|
1477
|
+
self.pos = _save9
|
1478
|
+
break
|
1479
|
+
end
|
1480
|
+
_tmp = apply(:__hyphen_)
|
1481
|
+
unless _tmp
|
1482
|
+
self.pos = _save9
|
1483
|
+
break
|
1484
|
+
end
|
1485
|
+
_tmp = match_string(">")
|
1486
|
+
unless _tmp
|
1487
|
+
self.pos = _save9
|
1488
|
+
break
|
1489
|
+
end
|
1490
|
+
@result = begin; @g.collect(o) ; end
|
1491
|
+
_tmp = true
|
1492
|
+
unless _tmp
|
1493
|
+
self.pos = _save9
|
1494
|
+
end
|
1495
|
+
break
|
1496
|
+
end # end sequence
|
1497
|
+
|
1498
|
+
break if _tmp
|
1499
|
+
self.pos = _save
|
1500
|
+
_tmp = apply(:_curly_block)
|
1501
|
+
break if _tmp
|
1502
|
+
self.pos = _save
|
1503
|
+
|
1504
|
+
_save10 = self.pos
|
1505
|
+
while true # sequence
|
1506
|
+
_tmp = match_string(".")
|
1507
|
+
unless _tmp
|
1508
|
+
self.pos = _save10
|
1509
|
+
break
|
1510
|
+
end
|
1511
|
+
@result = begin; @g.dot ; end
|
1512
|
+
_tmp = true
|
1513
|
+
unless _tmp
|
1514
|
+
self.pos = _save10
|
1515
|
+
end
|
1516
|
+
break
|
1517
|
+
end # end sequence
|
1518
|
+
|
1519
|
+
break if _tmp
|
1520
|
+
self.pos = _save
|
1521
|
+
|
1522
|
+
_save11 = self.pos
|
1523
|
+
while true # sequence
|
1524
|
+
_tmp = match_string("@")
|
1525
|
+
unless _tmp
|
1526
|
+
self.pos = _save11
|
1527
|
+
break
|
1528
|
+
end
|
1529
|
+
_tmp = apply(:_var)
|
1530
|
+
name = @result
|
1531
|
+
unless _tmp
|
1532
|
+
self.pos = _save11
|
1533
|
+
break
|
1534
|
+
end
|
1535
|
+
_save12 = self.pos
|
1536
|
+
|
1537
|
+
_save13 = self.pos
|
1538
|
+
while true # sequence
|
1539
|
+
_tmp = apply(:__hyphen_)
|
1540
|
+
unless _tmp
|
1541
|
+
self.pos = _save13
|
1542
|
+
break
|
1543
|
+
end
|
1544
|
+
_tmp = match_string("=")
|
1545
|
+
unless _tmp
|
1546
|
+
self.pos = _save13
|
1547
|
+
end
|
1548
|
+
break
|
1549
|
+
end # end sequence
|
1550
|
+
|
1551
|
+
_tmp = _tmp ? nil : true
|
1552
|
+
self.pos = _save12
|
1553
|
+
unless _tmp
|
1554
|
+
self.pos = _save11
|
1555
|
+
break
|
1556
|
+
end
|
1557
|
+
@result = begin; @g.invoke(name) ; end
|
1558
|
+
_tmp = true
|
1559
|
+
unless _tmp
|
1560
|
+
self.pos = _save11
|
1561
|
+
end
|
1562
|
+
break
|
1563
|
+
end # end sequence
|
1564
|
+
|
1565
|
+
break if _tmp
|
1566
|
+
self.pos = _save
|
1567
|
+
|
1568
|
+
_save14 = self.pos
|
1569
|
+
while true # sequence
|
1570
|
+
_tmp = match_string("^")
|
1571
|
+
unless _tmp
|
1572
|
+
self.pos = _save14
|
1573
|
+
break
|
1574
|
+
end
|
1575
|
+
_tmp = apply(:_var)
|
1576
|
+
name = @result
|
1577
|
+
unless _tmp
|
1578
|
+
self.pos = _save14
|
1579
|
+
break
|
1580
|
+
end
|
1581
|
+
_text_start = self.pos
|
1582
|
+
_save15 = self.pos
|
1583
|
+
_tmp = apply(:_nested_paren)
|
1584
|
+
unless _tmp
|
1585
|
+
_tmp = true
|
1586
|
+
self.pos = _save15
|
1587
|
+
end
|
1588
|
+
if _tmp
|
1589
|
+
text = get_text(_text_start)
|
1590
|
+
end
|
1591
|
+
unless _tmp
|
1592
|
+
self.pos = _save14
|
1593
|
+
break
|
1594
|
+
end
|
1595
|
+
@result = begin; @g.foreign_invoke("parent", name, text) ; end
|
1596
|
+
_tmp = true
|
1597
|
+
unless _tmp
|
1598
|
+
self.pos = _save14
|
1599
|
+
end
|
1600
|
+
break
|
1601
|
+
end # end sequence
|
1602
|
+
|
1603
|
+
break if _tmp
|
1604
|
+
self.pos = _save
|
1605
|
+
|
1606
|
+
_save16 = self.pos
|
1607
|
+
while true # sequence
|
1608
|
+
_tmp = match_string("%")
|
1609
|
+
unless _tmp
|
1610
|
+
self.pos = _save16
|
1611
|
+
break
|
1612
|
+
end
|
1613
|
+
_tmp = apply(:_var)
|
1614
|
+
gram = @result
|
1615
|
+
unless _tmp
|
1616
|
+
self.pos = _save16
|
1617
|
+
break
|
1618
|
+
end
|
1619
|
+
_tmp = match_string(".")
|
1620
|
+
unless _tmp
|
1621
|
+
self.pos = _save16
|
1622
|
+
break
|
1623
|
+
end
|
1624
|
+
_tmp = apply(:_var)
|
1625
|
+
name = @result
|
1626
|
+
unless _tmp
|
1627
|
+
self.pos = _save16
|
1628
|
+
break
|
1629
|
+
end
|
1630
|
+
_text_start = self.pos
|
1631
|
+
_save17 = self.pos
|
1632
|
+
_tmp = apply(:_nested_paren)
|
1633
|
+
unless _tmp
|
1634
|
+
_tmp = true
|
1635
|
+
self.pos = _save17
|
1636
|
+
end
|
1637
|
+
if _tmp
|
1638
|
+
text = get_text(_text_start)
|
1639
|
+
end
|
1640
|
+
unless _tmp
|
1641
|
+
self.pos = _save16
|
1642
|
+
break
|
1643
|
+
end
|
1644
|
+
@result = begin; @g.foreign_invoke(gram, name, text) ; end
|
1645
|
+
_tmp = true
|
1646
|
+
unless _tmp
|
1647
|
+
self.pos = _save16
|
1648
|
+
end
|
1649
|
+
break
|
1650
|
+
end # end sequence
|
1651
|
+
|
1652
|
+
break if _tmp
|
1653
|
+
self.pos = _save
|
1654
|
+
|
1655
|
+
_save18 = self.pos
|
1656
|
+
while true # sequence
|
1657
|
+
_tmp = apply(:_var)
|
1658
|
+
name = @result
|
1659
|
+
unless _tmp
|
1660
|
+
self.pos = _save18
|
1661
|
+
break
|
1662
|
+
end
|
1663
|
+
_text_start = self.pos
|
1664
|
+
_save19 = self.pos
|
1665
|
+
_tmp = apply(:_nested_paren)
|
1666
|
+
unless _tmp
|
1667
|
+
_tmp = true
|
1668
|
+
self.pos = _save19
|
1669
|
+
end
|
1670
|
+
if _tmp
|
1671
|
+
text = get_text(_text_start)
|
1672
|
+
end
|
1673
|
+
unless _tmp
|
1674
|
+
self.pos = _save18
|
1675
|
+
break
|
1676
|
+
end
|
1677
|
+
_save20 = self.pos
|
1678
|
+
|
1679
|
+
_save21 = self.pos
|
1680
|
+
while true # sequence
|
1681
|
+
_tmp = apply(:__hyphen_)
|
1682
|
+
unless _tmp
|
1683
|
+
self.pos = _save21
|
1684
|
+
break
|
1685
|
+
end
|
1686
|
+
_tmp = match_string("=")
|
1687
|
+
unless _tmp
|
1688
|
+
self.pos = _save21
|
1689
|
+
end
|
1690
|
+
break
|
1691
|
+
end # end sequence
|
1692
|
+
|
1693
|
+
_tmp = _tmp ? nil : true
|
1694
|
+
self.pos = _save20
|
1695
|
+
unless _tmp
|
1696
|
+
self.pos = _save18
|
1697
|
+
break
|
1698
|
+
end
|
1699
|
+
@result = begin; text.empty? ? @g.ref(name) : @g.invoke(name, text) ; end
|
1700
|
+
_tmp = true
|
1701
|
+
unless _tmp
|
1702
|
+
self.pos = _save18
|
1703
|
+
end
|
1704
|
+
break
|
1705
|
+
end # end sequence
|
1706
|
+
|
1707
|
+
break if _tmp
|
1708
|
+
self.pos = _save
|
1709
|
+
_tmp = apply(:_char_range)
|
1710
|
+
break if _tmp
|
1711
|
+
self.pos = _save
|
1712
|
+
_tmp = apply(:_regexp)
|
1713
|
+
break if _tmp
|
1714
|
+
self.pos = _save
|
1715
|
+
_tmp = apply(:_string)
|
1716
|
+
break if _tmp
|
1717
|
+
self.pos = _save
|
1718
|
+
break
|
1719
|
+
end # end choice
|
1720
|
+
|
1721
|
+
set_failed_rule :_value unless _tmp
|
1722
|
+
return _tmp
|
1723
|
+
end
|
1724
|
+
|
1725
|
+
# spaces = (space | comment)+
|
1726
|
+
def _spaces
|
1727
|
+
_save = self.pos
|
1728
|
+
|
1729
|
+
_save1 = self.pos
|
1730
|
+
while true # choice
|
1731
|
+
_tmp = apply(:_space)
|
1732
|
+
break if _tmp
|
1733
|
+
self.pos = _save1
|
1734
|
+
_tmp = apply(:_comment)
|
1735
|
+
break if _tmp
|
1736
|
+
self.pos = _save1
|
1737
|
+
break
|
1738
|
+
end # end choice
|
1739
|
+
|
1740
|
+
if _tmp
|
1741
|
+
while true
|
1742
|
+
|
1743
|
+
_save2 = self.pos
|
1744
|
+
while true # choice
|
1745
|
+
_tmp = apply(:_space)
|
1746
|
+
break if _tmp
|
1747
|
+
self.pos = _save2
|
1748
|
+
_tmp = apply(:_comment)
|
1749
|
+
break if _tmp
|
1750
|
+
self.pos = _save2
|
1751
|
+
break
|
1752
|
+
end # end choice
|
1753
|
+
|
1754
|
+
break unless _tmp
|
1755
|
+
end
|
1756
|
+
_tmp = true
|
1757
|
+
else
|
1758
|
+
self.pos = _save
|
1759
|
+
end
|
1760
|
+
set_failed_rule :_spaces unless _tmp
|
1761
|
+
return _tmp
|
1762
|
+
end
|
1763
|
+
|
1764
|
+
# values = (values:s spaces value:v { @g.seq(s, v) } | value:l spaces value:r { @g.seq(l, r) } | value)
|
1765
|
+
def _values
|
1766
|
+
|
1767
|
+
_save = self.pos
|
1768
|
+
while true # choice
|
1769
|
+
|
1770
|
+
_save1 = self.pos
|
1771
|
+
while true # sequence
|
1772
|
+
_tmp = apply(:_values)
|
1773
|
+
s = @result
|
1774
|
+
unless _tmp
|
1775
|
+
self.pos = _save1
|
1776
|
+
break
|
1777
|
+
end
|
1778
|
+
_tmp = apply(:_spaces)
|
1779
|
+
unless _tmp
|
1780
|
+
self.pos = _save1
|
1781
|
+
break
|
1782
|
+
end
|
1783
|
+
_tmp = apply(:_value)
|
1784
|
+
v = @result
|
1785
|
+
unless _tmp
|
1786
|
+
self.pos = _save1
|
1787
|
+
break
|
1788
|
+
end
|
1789
|
+
@result = begin; @g.seq(s, v) ; end
|
1790
|
+
_tmp = true
|
1791
|
+
unless _tmp
|
1792
|
+
self.pos = _save1
|
1793
|
+
end
|
1794
|
+
break
|
1795
|
+
end # end sequence
|
1796
|
+
|
1797
|
+
break if _tmp
|
1798
|
+
self.pos = _save
|
1799
|
+
|
1800
|
+
_save2 = self.pos
|
1801
|
+
while true # sequence
|
1802
|
+
_tmp = apply(:_value)
|
1803
|
+
l = @result
|
1804
|
+
unless _tmp
|
1805
|
+
self.pos = _save2
|
1806
|
+
break
|
1807
|
+
end
|
1808
|
+
_tmp = apply(:_spaces)
|
1809
|
+
unless _tmp
|
1810
|
+
self.pos = _save2
|
1811
|
+
break
|
1812
|
+
end
|
1813
|
+
_tmp = apply(:_value)
|
1814
|
+
r = @result
|
1815
|
+
unless _tmp
|
1816
|
+
self.pos = _save2
|
1817
|
+
break
|
1818
|
+
end
|
1819
|
+
@result = begin; @g.seq(l, r) ; end
|
1820
|
+
_tmp = true
|
1821
|
+
unless _tmp
|
1822
|
+
self.pos = _save2
|
1823
|
+
end
|
1824
|
+
break
|
1825
|
+
end # end sequence
|
1826
|
+
|
1827
|
+
break if _tmp
|
1828
|
+
self.pos = _save
|
1829
|
+
_tmp = apply(:_value)
|
1830
|
+
break if _tmp
|
1831
|
+
self.pos = _save
|
1832
|
+
break
|
1833
|
+
end # end choice
|
1834
|
+
|
1835
|
+
set_failed_rule :_values unless _tmp
|
1836
|
+
return _tmp
|
1837
|
+
end
|
1838
|
+
|
1839
|
+
# choose_cont = - "|" - values:v { v }
|
1840
|
+
def _choose_cont
|
1841
|
+
|
1842
|
+
_save = self.pos
|
1843
|
+
while true # sequence
|
1844
|
+
_tmp = apply(:__hyphen_)
|
1845
|
+
unless _tmp
|
1846
|
+
self.pos = _save
|
1847
|
+
break
|
1848
|
+
end
|
1849
|
+
_tmp = match_string("|")
|
1850
|
+
unless _tmp
|
1851
|
+
self.pos = _save
|
1852
|
+
break
|
1853
|
+
end
|
1854
|
+
_tmp = apply(:__hyphen_)
|
1855
|
+
unless _tmp
|
1856
|
+
self.pos = _save
|
1857
|
+
break
|
1858
|
+
end
|
1859
|
+
_tmp = apply(:_values)
|
1860
|
+
v = @result
|
1861
|
+
unless _tmp
|
1862
|
+
self.pos = _save
|
1863
|
+
break
|
1864
|
+
end
|
1865
|
+
@result = begin; v ; end
|
1866
|
+
_tmp = true
|
1867
|
+
unless _tmp
|
1868
|
+
self.pos = _save
|
1869
|
+
end
|
1870
|
+
break
|
1871
|
+
end # end sequence
|
1872
|
+
|
1873
|
+
set_failed_rule :_choose_cont unless _tmp
|
1874
|
+
return _tmp
|
1875
|
+
end
|
1876
|
+
|
1877
|
+
# expression = (values:v choose_cont+:alts { @g.any(v, *alts) } | values)
|
1878
|
+
def _expression
|
1879
|
+
|
1880
|
+
_save = self.pos
|
1881
|
+
while true # choice
|
1882
|
+
|
1883
|
+
_save1 = self.pos
|
1884
|
+
while true # sequence
|
1885
|
+
_tmp = apply(:_values)
|
1886
|
+
v = @result
|
1887
|
+
unless _tmp
|
1888
|
+
self.pos = _save1
|
1889
|
+
break
|
1890
|
+
end
|
1891
|
+
_save2 = self.pos
|
1892
|
+
_ary = []
|
1893
|
+
_tmp = apply(:_choose_cont)
|
1894
|
+
if _tmp
|
1895
|
+
_ary << @result
|
1896
|
+
while true
|
1897
|
+
_tmp = apply(:_choose_cont)
|
1898
|
+
_ary << @result if _tmp
|
1899
|
+
break unless _tmp
|
1900
|
+
end
|
1901
|
+
_tmp = true
|
1902
|
+
@result = _ary
|
1903
|
+
else
|
1904
|
+
self.pos = _save2
|
1905
|
+
end
|
1906
|
+
alts = @result
|
1907
|
+
unless _tmp
|
1908
|
+
self.pos = _save1
|
1909
|
+
break
|
1910
|
+
end
|
1911
|
+
@result = begin; @g.any(v, *alts) ; end
|
1912
|
+
_tmp = true
|
1913
|
+
unless _tmp
|
1914
|
+
self.pos = _save1
|
1915
|
+
end
|
1916
|
+
break
|
1917
|
+
end # end sequence
|
1918
|
+
|
1919
|
+
break if _tmp
|
1920
|
+
self.pos = _save
|
1921
|
+
_tmp = apply(:_values)
|
1922
|
+
break if _tmp
|
1923
|
+
self.pos = _save
|
1924
|
+
break
|
1925
|
+
end # end choice
|
1926
|
+
|
1927
|
+
set_failed_rule :_expression unless _tmp
|
1928
|
+
return _tmp
|
1929
|
+
end
|
1930
|
+
|
1931
|
+
# args = (args:a "," - var:n - { a + [n] } | - var:n - { [n] })
|
1932
|
+
def _args
|
1933
|
+
|
1934
|
+
_save = self.pos
|
1935
|
+
while true # choice
|
1936
|
+
|
1937
|
+
_save1 = self.pos
|
1938
|
+
while true # sequence
|
1939
|
+
_tmp = apply(:_args)
|
1940
|
+
a = @result
|
1941
|
+
unless _tmp
|
1942
|
+
self.pos = _save1
|
1943
|
+
break
|
1944
|
+
end
|
1945
|
+
_tmp = match_string(",")
|
1946
|
+
unless _tmp
|
1947
|
+
self.pos = _save1
|
1948
|
+
break
|
1949
|
+
end
|
1950
|
+
_tmp = apply(:__hyphen_)
|
1951
|
+
unless _tmp
|
1952
|
+
self.pos = _save1
|
1953
|
+
break
|
1954
|
+
end
|
1955
|
+
_tmp = apply(:_var)
|
1956
|
+
n = @result
|
1957
|
+
unless _tmp
|
1958
|
+
self.pos = _save1
|
1959
|
+
break
|
1960
|
+
end
|
1961
|
+
_tmp = apply(:__hyphen_)
|
1962
|
+
unless _tmp
|
1963
|
+
self.pos = _save1
|
1964
|
+
break
|
1965
|
+
end
|
1966
|
+
@result = begin; a + [n] ; end
|
1967
|
+
_tmp = true
|
1968
|
+
unless _tmp
|
1969
|
+
self.pos = _save1
|
1970
|
+
end
|
1971
|
+
break
|
1972
|
+
end # end sequence
|
1973
|
+
|
1974
|
+
break if _tmp
|
1975
|
+
self.pos = _save
|
1976
|
+
|
1977
|
+
_save2 = self.pos
|
1978
|
+
while true # sequence
|
1979
|
+
_tmp = apply(:__hyphen_)
|
1980
|
+
unless _tmp
|
1981
|
+
self.pos = _save2
|
1982
|
+
break
|
1983
|
+
end
|
1984
|
+
_tmp = apply(:_var)
|
1985
|
+
n = @result
|
1986
|
+
unless _tmp
|
1987
|
+
self.pos = _save2
|
1988
|
+
break
|
1989
|
+
end
|
1990
|
+
_tmp = apply(:__hyphen_)
|
1991
|
+
unless _tmp
|
1992
|
+
self.pos = _save2
|
1993
|
+
break
|
1994
|
+
end
|
1995
|
+
@result = begin; [n] ; end
|
1996
|
+
_tmp = true
|
1997
|
+
unless _tmp
|
1998
|
+
self.pos = _save2
|
1999
|
+
end
|
2000
|
+
break
|
2001
|
+
end # end sequence
|
2002
|
+
|
2003
|
+
break if _tmp
|
2004
|
+
self.pos = _save
|
2005
|
+
break
|
2006
|
+
end # end choice
|
2007
|
+
|
2008
|
+
set_failed_rule :_args unless _tmp
|
2009
|
+
return _tmp
|
2010
|
+
end
|
2011
|
+
|
2012
|
+
# statement = (- var:v "(" args:a ")" - "=" - expression:o { @g.set(v, o, a) } | - var:v - "=" - expression:o { @g.set(v, o) } | - "%" var:name - "=" - < /[::A-Za-z]+/ > { @g.add_foreign_grammar(name, text) } | - "%%" - curly:act { @g.add_setup act } | - "%%" - var:name - "=" - < (!"\n" .)+ > { @g.set_variable(name, text) })
|
2013
|
+
def _statement
|
2014
|
+
|
2015
|
+
_save = self.pos
|
2016
|
+
while true # choice
|
2017
|
+
|
2018
|
+
_save1 = self.pos
|
2019
|
+
while true # sequence
|
2020
|
+
_tmp = apply(:__hyphen_)
|
2021
|
+
unless _tmp
|
2022
|
+
self.pos = _save1
|
2023
|
+
break
|
2024
|
+
end
|
2025
|
+
_tmp = apply(:_var)
|
2026
|
+
v = @result
|
2027
|
+
unless _tmp
|
2028
|
+
self.pos = _save1
|
2029
|
+
break
|
2030
|
+
end
|
2031
|
+
_tmp = match_string("(")
|
2032
|
+
unless _tmp
|
2033
|
+
self.pos = _save1
|
2034
|
+
break
|
2035
|
+
end
|
2036
|
+
_tmp = apply(:_args)
|
2037
|
+
a = @result
|
2038
|
+
unless _tmp
|
2039
|
+
self.pos = _save1
|
2040
|
+
break
|
2041
|
+
end
|
2042
|
+
_tmp = match_string(")")
|
2043
|
+
unless _tmp
|
2044
|
+
self.pos = _save1
|
2045
|
+
break
|
2046
|
+
end
|
2047
|
+
_tmp = apply(:__hyphen_)
|
2048
|
+
unless _tmp
|
2049
|
+
self.pos = _save1
|
2050
|
+
break
|
2051
|
+
end
|
2052
|
+
_tmp = match_string("=")
|
2053
|
+
unless _tmp
|
2054
|
+
self.pos = _save1
|
2055
|
+
break
|
2056
|
+
end
|
2057
|
+
_tmp = apply(:__hyphen_)
|
2058
|
+
unless _tmp
|
2059
|
+
self.pos = _save1
|
2060
|
+
break
|
2061
|
+
end
|
2062
|
+
_tmp = apply(:_expression)
|
2063
|
+
o = @result
|
2064
|
+
unless _tmp
|
2065
|
+
self.pos = _save1
|
2066
|
+
break
|
2067
|
+
end
|
2068
|
+
@result = begin; @g.set(v, o, a) ; end
|
2069
|
+
_tmp = true
|
2070
|
+
unless _tmp
|
2071
|
+
self.pos = _save1
|
2072
|
+
end
|
2073
|
+
break
|
2074
|
+
end # end sequence
|
2075
|
+
|
2076
|
+
break if _tmp
|
2077
|
+
self.pos = _save
|
2078
|
+
|
2079
|
+
_save2 = self.pos
|
2080
|
+
while true # sequence
|
2081
|
+
_tmp = apply(:__hyphen_)
|
2082
|
+
unless _tmp
|
2083
|
+
self.pos = _save2
|
2084
|
+
break
|
2085
|
+
end
|
2086
|
+
_tmp = apply(:_var)
|
2087
|
+
v = @result
|
2088
|
+
unless _tmp
|
2089
|
+
self.pos = _save2
|
2090
|
+
break
|
2091
|
+
end
|
2092
|
+
_tmp = apply(:__hyphen_)
|
2093
|
+
unless _tmp
|
2094
|
+
self.pos = _save2
|
2095
|
+
break
|
2096
|
+
end
|
2097
|
+
_tmp = match_string("=")
|
2098
|
+
unless _tmp
|
2099
|
+
self.pos = _save2
|
2100
|
+
break
|
2101
|
+
end
|
2102
|
+
_tmp = apply(:__hyphen_)
|
2103
|
+
unless _tmp
|
2104
|
+
self.pos = _save2
|
2105
|
+
break
|
2106
|
+
end
|
2107
|
+
_tmp = apply(:_expression)
|
2108
|
+
o = @result
|
2109
|
+
unless _tmp
|
2110
|
+
self.pos = _save2
|
2111
|
+
break
|
2112
|
+
end
|
2113
|
+
@result = begin; @g.set(v, o) ; end
|
2114
|
+
_tmp = true
|
2115
|
+
unless _tmp
|
2116
|
+
self.pos = _save2
|
2117
|
+
end
|
2118
|
+
break
|
2119
|
+
end # end sequence
|
2120
|
+
|
2121
|
+
break if _tmp
|
2122
|
+
self.pos = _save
|
2123
|
+
|
2124
|
+
_save3 = self.pos
|
2125
|
+
while true # sequence
|
2126
|
+
_tmp = apply(:__hyphen_)
|
2127
|
+
unless _tmp
|
2128
|
+
self.pos = _save3
|
2129
|
+
break
|
2130
|
+
end
|
2131
|
+
_tmp = match_string("%")
|
2132
|
+
unless _tmp
|
2133
|
+
self.pos = _save3
|
2134
|
+
break
|
2135
|
+
end
|
2136
|
+
_tmp = apply(:_var)
|
2137
|
+
name = @result
|
2138
|
+
unless _tmp
|
2139
|
+
self.pos = _save3
|
2140
|
+
break
|
2141
|
+
end
|
2142
|
+
_tmp = apply(:__hyphen_)
|
2143
|
+
unless _tmp
|
2144
|
+
self.pos = _save3
|
2145
|
+
break
|
2146
|
+
end
|
2147
|
+
_tmp = match_string("=")
|
2148
|
+
unless _tmp
|
2149
|
+
self.pos = _save3
|
2150
|
+
break
|
2151
|
+
end
|
2152
|
+
_tmp = apply(:__hyphen_)
|
2153
|
+
unless _tmp
|
2154
|
+
self.pos = _save3
|
2155
|
+
break
|
2156
|
+
end
|
2157
|
+
_text_start = self.pos
|
2158
|
+
_tmp = scan(/\A(?-mix:[::A-Za-z]+)/)
|
2159
|
+
if _tmp
|
2160
|
+
text = get_text(_text_start)
|
2161
|
+
end
|
2162
|
+
unless _tmp
|
2163
|
+
self.pos = _save3
|
2164
|
+
break
|
2165
|
+
end
|
2166
|
+
@result = begin; @g.add_foreign_grammar(name, text) ; end
|
2167
|
+
_tmp = true
|
2168
|
+
unless _tmp
|
2169
|
+
self.pos = _save3
|
2170
|
+
end
|
2171
|
+
break
|
2172
|
+
end # end sequence
|
2173
|
+
|
2174
|
+
break if _tmp
|
2175
|
+
self.pos = _save
|
2176
|
+
|
2177
|
+
_save4 = self.pos
|
2178
|
+
while true # sequence
|
2179
|
+
_tmp = apply(:__hyphen_)
|
2180
|
+
unless _tmp
|
2181
|
+
self.pos = _save4
|
2182
|
+
break
|
2183
|
+
end
|
2184
|
+
_tmp = match_string("%%")
|
2185
|
+
unless _tmp
|
2186
|
+
self.pos = _save4
|
2187
|
+
break
|
2188
|
+
end
|
2189
|
+
_tmp = apply(:__hyphen_)
|
2190
|
+
unless _tmp
|
2191
|
+
self.pos = _save4
|
2192
|
+
break
|
2193
|
+
end
|
2194
|
+
_tmp = apply(:_curly)
|
2195
|
+
act = @result
|
2196
|
+
unless _tmp
|
2197
|
+
self.pos = _save4
|
2198
|
+
break
|
2199
|
+
end
|
2200
|
+
@result = begin; @g.add_setup act ; end
|
2201
|
+
_tmp = true
|
2202
|
+
unless _tmp
|
2203
|
+
self.pos = _save4
|
2204
|
+
end
|
2205
|
+
break
|
2206
|
+
end # end sequence
|
2207
|
+
|
2208
|
+
break if _tmp
|
2209
|
+
self.pos = _save
|
2210
|
+
|
2211
|
+
_save5 = self.pos
|
2212
|
+
while true # sequence
|
2213
|
+
_tmp = apply(:__hyphen_)
|
2214
|
+
unless _tmp
|
2215
|
+
self.pos = _save5
|
2216
|
+
break
|
2217
|
+
end
|
2218
|
+
_tmp = match_string("%%")
|
2219
|
+
unless _tmp
|
2220
|
+
self.pos = _save5
|
2221
|
+
break
|
2222
|
+
end
|
2223
|
+
_tmp = apply(:__hyphen_)
|
2224
|
+
unless _tmp
|
2225
|
+
self.pos = _save5
|
2226
|
+
break
|
2227
|
+
end
|
2228
|
+
_tmp = apply(:_var)
|
2229
|
+
name = @result
|
2230
|
+
unless _tmp
|
2231
|
+
self.pos = _save5
|
2232
|
+
break
|
2233
|
+
end
|
2234
|
+
_tmp = apply(:__hyphen_)
|
2235
|
+
unless _tmp
|
2236
|
+
self.pos = _save5
|
2237
|
+
break
|
2238
|
+
end
|
2239
|
+
_tmp = match_string("=")
|
2240
|
+
unless _tmp
|
2241
|
+
self.pos = _save5
|
2242
|
+
break
|
2243
|
+
end
|
2244
|
+
_tmp = apply(:__hyphen_)
|
2245
|
+
unless _tmp
|
2246
|
+
self.pos = _save5
|
2247
|
+
break
|
2248
|
+
end
|
2249
|
+
_text_start = self.pos
|
2250
|
+
_save6 = self.pos
|
2251
|
+
|
2252
|
+
_save7 = self.pos
|
2253
|
+
while true # sequence
|
2254
|
+
_save8 = self.pos
|
2255
|
+
_tmp = match_string("\n")
|
2256
|
+
_tmp = _tmp ? nil : true
|
2257
|
+
self.pos = _save8
|
2258
|
+
unless _tmp
|
2259
|
+
self.pos = _save7
|
2260
|
+
break
|
2261
|
+
end
|
2262
|
+
_tmp = get_byte
|
2263
|
+
unless _tmp
|
2264
|
+
self.pos = _save7
|
2265
|
+
end
|
2266
|
+
break
|
2267
|
+
end # end sequence
|
2268
|
+
|
2269
|
+
if _tmp
|
2270
|
+
while true
|
2271
|
+
|
2272
|
+
_save9 = self.pos
|
2273
|
+
while true # sequence
|
2274
|
+
_save10 = self.pos
|
2275
|
+
_tmp = match_string("\n")
|
2276
|
+
_tmp = _tmp ? nil : true
|
2277
|
+
self.pos = _save10
|
2278
|
+
unless _tmp
|
2279
|
+
self.pos = _save9
|
2280
|
+
break
|
2281
|
+
end
|
2282
|
+
_tmp = get_byte
|
2283
|
+
unless _tmp
|
2284
|
+
self.pos = _save9
|
2285
|
+
end
|
2286
|
+
break
|
2287
|
+
end # end sequence
|
2288
|
+
|
2289
|
+
break unless _tmp
|
2290
|
+
end
|
2291
|
+
_tmp = true
|
2292
|
+
else
|
2293
|
+
self.pos = _save6
|
2294
|
+
end
|
2295
|
+
if _tmp
|
2296
|
+
text = get_text(_text_start)
|
2297
|
+
end
|
2298
|
+
unless _tmp
|
2299
|
+
self.pos = _save5
|
2300
|
+
break
|
2301
|
+
end
|
2302
|
+
@result = begin; @g.set_variable(name, text) ; end
|
2303
|
+
_tmp = true
|
2304
|
+
unless _tmp
|
2305
|
+
self.pos = _save5
|
2306
|
+
end
|
2307
|
+
break
|
2308
|
+
end # end sequence
|
2309
|
+
|
2310
|
+
break if _tmp
|
2311
|
+
self.pos = _save
|
2312
|
+
break
|
2313
|
+
end # end choice
|
2314
|
+
|
2315
|
+
set_failed_rule :_statement unless _tmp
|
2316
|
+
return _tmp
|
2317
|
+
end
|
2318
|
+
|
2319
|
+
# statements = statement (- statements)?
|
2320
|
+
def _statements
|
2321
|
+
|
2322
|
+
_save = self.pos
|
2323
|
+
while true # sequence
|
2324
|
+
_tmp = apply(:_statement)
|
2325
|
+
unless _tmp
|
2326
|
+
self.pos = _save
|
2327
|
+
break
|
2328
|
+
end
|
2329
|
+
_save1 = self.pos
|
2330
|
+
|
2331
|
+
_save2 = self.pos
|
2332
|
+
while true # sequence
|
2333
|
+
_tmp = apply(:__hyphen_)
|
2334
|
+
unless _tmp
|
2335
|
+
self.pos = _save2
|
2336
|
+
break
|
2337
|
+
end
|
2338
|
+
_tmp = apply(:_statements)
|
2339
|
+
unless _tmp
|
2340
|
+
self.pos = _save2
|
2341
|
+
end
|
2342
|
+
break
|
2343
|
+
end # end sequence
|
2344
|
+
|
2345
|
+
unless _tmp
|
2346
|
+
_tmp = true
|
2347
|
+
self.pos = _save1
|
2348
|
+
end
|
2349
|
+
unless _tmp
|
2350
|
+
self.pos = _save
|
2351
|
+
end
|
2352
|
+
break
|
2353
|
+
end # end sequence
|
2354
|
+
|
2355
|
+
set_failed_rule :_statements unless _tmp
|
2356
|
+
return _tmp
|
2357
|
+
end
|
2358
|
+
|
2359
|
+
# eof = !.
|
2360
|
+
def _eof
|
2361
|
+
_save = self.pos
|
2362
|
+
_tmp = get_byte
|
2363
|
+
_tmp = _tmp ? nil : true
|
2364
|
+
self.pos = _save
|
2365
|
+
set_failed_rule :_eof unless _tmp
|
2366
|
+
return _tmp
|
2367
|
+
end
|
2368
|
+
|
2369
|
+
# root = statements - "\n"? eof
|
2370
|
+
def _root
|
2371
|
+
|
2372
|
+
_save = self.pos
|
2373
|
+
while true # sequence
|
2374
|
+
_tmp = apply(:_statements)
|
2375
|
+
unless _tmp
|
2376
|
+
self.pos = _save
|
2377
|
+
break
|
2378
|
+
end
|
2379
|
+
_tmp = apply(:__hyphen_)
|
2380
|
+
unless _tmp
|
2381
|
+
self.pos = _save
|
2382
|
+
break
|
2383
|
+
end
|
2384
|
+
_save1 = self.pos
|
2385
|
+
_tmp = match_string("\n")
|
2386
|
+
unless _tmp
|
2387
|
+
_tmp = true
|
2388
|
+
self.pos = _save1
|
2389
|
+
end
|
2390
|
+
unless _tmp
|
2391
|
+
self.pos = _save
|
2392
|
+
break
|
2393
|
+
end
|
2394
|
+
_tmp = apply(:_eof)
|
2395
|
+
unless _tmp
|
2396
|
+
self.pos = _save
|
2397
|
+
end
|
2398
|
+
break
|
2399
|
+
end # end sequence
|
2400
|
+
|
2401
|
+
set_failed_rule :_root unless _tmp
|
2402
|
+
return _tmp
|
2403
|
+
end
|
2404
|
+
|
2405
|
+
Rules = {}
|
2406
|
+
Rules[:_eol] = rule_info("eol", "\"\\n\"")
|
2407
|
+
Rules[:_comment] = rule_info("comment", "\"\#\" (!eol .)* eol")
|
2408
|
+
Rules[:_space] = rule_info("space", "(\" \" | \"\\t\" | eol)")
|
2409
|
+
Rules[:__hyphen_] = rule_info("-", "(space | comment)*")
|
2410
|
+
Rules[:_var] = rule_info("var", "< (\"-\" | /[a-zA-Z][\\-_a-zA-Z0-9]*/) > { text }")
|
2411
|
+
Rules[:_dbl_escapes] = rule_info("dbl_escapes", "(\"\\\\\\\"\" { '\"' } | \"\\\\n\" { \"\\n\" } | \"\\\\t\" { \"\\t\" } | \"\\\\b\" { \"\\b\" } | \"\\\\\\\\\" { \"\\\\\" })")
|
2412
|
+
Rules[:_dbl_seq] = rule_info("dbl_seq", "< /[^\\\\\"]+/ > { text }")
|
2413
|
+
Rules[:_dbl_not_quote] = rule_info("dbl_not_quote", "(dbl_escapes:s | dbl_seq:s)+:ary { ary }")
|
2414
|
+
Rules[:_dbl_string] = rule_info("dbl_string", "\"\\\"\" dbl_not_quote:s \"\\\"\" { @g.str(s.join) }")
|
2415
|
+
Rules[:_sgl_escape_quote] = rule_info("sgl_escape_quote", "\"\\\\'\" { \"'\" }")
|
2416
|
+
Rules[:_sgl_seq] = rule_info("sgl_seq", "< /[^']/ > { text }")
|
2417
|
+
Rules[:_sgl_not_quote] = rule_info("sgl_not_quote", "(sgl_escape_quote | sgl_seq)+:segs { segs.join }")
|
2418
|
+
Rules[:_sgl_string] = rule_info("sgl_string", "\"'\" sgl_not_quote:s \"'\" { @g.str(s) }")
|
2419
|
+
Rules[:_string] = rule_info("string", "(dbl_string | sgl_string)")
|
2420
|
+
Rules[:_not_slash] = rule_info("not_slash", "< (\"\\\\/\" | /[^\\/]/)+ > { text }")
|
2421
|
+
Rules[:_regexp_opts] = rule_info("regexp_opts", "< [a-z]* > { text }")
|
2422
|
+
Rules[:_regexp] = rule_info("regexp", "\"/\" not_slash:body \"/\" regexp_opts:opts { @g.reg body, opts }")
|
2423
|
+
Rules[:_char] = rule_info("char", "< /[a-zA-Z0-9]/ > { text }")
|
2424
|
+
Rules[:_char_range] = rule_info("char_range", "\"[\" char:l \"-\" char:r \"]\" { @g.range(l,r) }")
|
2425
|
+
Rules[:_range_elem] = rule_info("range_elem", "< /([1-9][0-9]*)|\\*/ > { text }")
|
2426
|
+
Rules[:_mult_range] = rule_info("mult_range", "\"[\" - range_elem:l - \",\" - range_elem:r - \"]\" { [l == \"*\" ? nil : l.to_i, r == \"*\" ? nil : r.to_i] }")
|
2427
|
+
Rules[:_curly_block] = rule_info("curly_block", "curly")
|
2428
|
+
Rules[:_curly] = rule_info("curly", "\"{\" < (/[^{}]+/ | curly)* > \"}\" { @g.action(text) }")
|
2429
|
+
Rules[:_nested_paren] = rule_info("nested_paren", "\"(\" (/[^()]+/ | nested_paren)* \")\"")
|
2430
|
+
Rules[:_value] = rule_info("value", "(value:v \":\" var:n { @g.t(v,n) } | value:v \"?\" { @g.maybe(v) } | value:v \"+\" { @g.many(v) } | value:v \"*\" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | \"&\" value:v { @g.andp(v) } | \"!\" value:v { @g.notp(v) } | \"(\" - expression:o - \")\" { o } | \"<\" - expression:o - \">\" { @g.collect(o) } | curly_block | \".\" { @g.dot } | \"@\" var:name !(- \"=\") { @g.invoke(name) } | \"^\" var:name < nested_paren? > { @g.foreign_invoke(\"parent\", name, text) } | \"%\" var:gram \".\" var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- \"=\") { text.empty? ? @g.ref(name) : @g.invoke(name, text) } | char_range | regexp | string)")
|
2431
|
+
Rules[:_spaces] = rule_info("spaces", "(space | comment)+")
|
2432
|
+
Rules[:_values] = rule_info("values", "(values:s spaces value:v { @g.seq(s, v) } | value:l spaces value:r { @g.seq(l, r) } | value)")
|
2433
|
+
Rules[:_choose_cont] = rule_info("choose_cont", "- \"|\" - values:v { v }")
|
2434
|
+
Rules[:_expression] = rule_info("expression", "(values:v choose_cont+:alts { @g.any(v, *alts) } | values)")
|
2435
|
+
Rules[:_args] = rule_info("args", "(args:a \",\" - var:n - { a + [n] } | - var:n - { [n] })")
|
2436
|
+
Rules[:_statement] = rule_info("statement", "(- var:v \"(\" args:a \")\" - \"=\" - expression:o { @g.set(v, o, a) } | - var:v - \"=\" - expression:o { @g.set(v, o) } | - \"%\" var:name - \"=\" - < /[::A-Za-z]+/ > { @g.add_foreign_grammar(name, text) } | - \"%%\" - curly:act { @g.add_setup act } | - \"%%\" - var:name - \"=\" - < (!\"\\n\" .)+ > { @g.set_variable(name, text) })")
|
2437
|
+
Rules[:_statements] = rule_info("statements", "statement (- statements)?")
|
2438
|
+
Rules[:_eof] = rule_info("eof", "!.")
|
2439
|
+
Rules[:_root] = rule_info("root", "statements - \"\\n\"? eof")
|
2440
|
+
end
|