Class: Racc::Grammar::DefinitionEnv
Instance Method Summary
collapse
-
#_add(target, x) ⇒ Object
-
#_added?(sym) ⇒ Boolean
-
#_delayed_add(rule) ⇒ Object
-
#_intern(x) ⇒ Object
-
#action(&block) ⇒ Object
(also: #_)
-
#flush_delayed ⇒ Object
-
#grammar ⇒ Object
-
#initialize ⇒ DefinitionEnv
constructor
A new instance of DefinitionEnv.
-
#many(sym, &block) ⇒ Object
-
#many1(sym, &block) ⇒ Object
-
#method_missing(mid, *args, &block) ⇒ Object
-
#null(&block) ⇒ Object
-
#option(sym, default = nil, &block) ⇒ Object
-
#precedence_table(&block) ⇒ Object
-
#separated_by(sep, sym, &block) ⇒ Object
-
#separated_by1(sep, sym, &block) ⇒ Object
-
#seq(*list, &block) ⇒ Object
Constructor Details
Returns a new instance of DefinitionEnv.
205
206
207
208
209
|
# File 'lib/racc/grammar.rb', line 205
def initialize
@grammar = Grammar.new
@seqs = Hash.new(0)
@delayed = []
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(mid, *args, &block) ⇒ Object
228
229
230
231
232
233
234
235
236
237
|
# File 'lib/racc/grammar.rb', line 228
def method_missing(mid, *args, &block)
unless mid.to_s[-1,1] == '='
super end
target = @grammar.intern(mid.to_s.chop.intern)
unless args.size == 1
raise ArgumentError, "too many arguments for #{mid} (#{args.size} for 1)"
end
_add target, args.first
end
|
Instance Method Details
#_add(target, x) ⇒ Object
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/racc/grammar.rb', line 239
def _add(target, x)
case x
when Sym
@delayed.each do |rule|
rule.replace x, target if rule.target == x
end
@grammar.symboltable.delete x
else
x.each_rule do |r|
r.target = target
@grammar.add r
end
end
flush_delayed
end
|
#_added?(sym) ⇒ Boolean
259
260
261
|
# File 'lib/racc/grammar.rb', line 259
def _added?(sym)
@grammar.added?(sym) or @delayed.detect {|r| r.target == sym }
end
|
#_delayed_add(rule) ⇒ Object
255
256
257
|
# File 'lib/racc/grammar.rb', line 255
def _delayed_add(rule)
@delayed.push rule
end
|
#_intern(x) ⇒ Object
318
319
320
321
322
323
324
325
326
327
|
# File 'lib/racc/grammar.rb', line 318
def _intern(x)
case x
when Symbol, String
@grammar.intern(x)
when Racc::Sym
x
else
raise TypeError, "wrong type #{x.class} (expected Symbol/String/Racc::Sym)"
end
end
|
#action(&block) ⇒ Object
Also known as:
_
279
280
281
282
283
|
# File 'lib/racc/grammar.rb', line 279
def action(&block)
id = "@#{@seqs["action"] += 1}".intern
_delayed_add Rule.new(@grammar.intern(id), [], UserAction.proc(block))
id
end
|
#flush_delayed ⇒ Object
263
264
265
266
267
268
269
|
# File 'lib/racc/grammar.rb', line 263
def flush_delayed
return if @delayed.empty?
@delayed.each do |rule|
@grammar.add rule
end
@delayed.clear
end
|
211
212
213
214
215
216
217
218
219
220
|
# File 'lib/racc/grammar.rb', line 211
def grammar
flush_delayed
@grammar.each do |rule|
if rule.specified_prec
rule.specified_prec = @grammar.intern(rule.specified_prec)
end
end
@grammar.init
@grammar
end
|
#many(sym, &block) ⇒ Object
293
294
295
296
297
298
|
# File 'lib/racc/grammar.rb', line 293
def many(sym, &block)
_defmetasyntax("many", _intern(sym), block) {|target|
seq() { [] }\
| seq(target, sym) {|list, x| list.push x; list }
}
end
|
#many1(sym, &block) ⇒ Object
300
301
302
303
304
305
|
# File 'lib/racc/grammar.rb', line 300
def many1(sym, &block)
_defmetasyntax("many1", _intern(sym), block) {|target|
seq(sym) {|x| [x] }\
| seq(target, sym) {|list, x| list.push x; list }
}
end
|
#null(&block) ⇒ Object
275
276
277
|
# File 'lib/racc/grammar.rb', line 275
def null(&block)
seq(&block)
end
|
#option(sym, default = nil, &block) ⇒ Object
287
288
289
290
291
|
# File 'lib/racc/grammar.rb', line 287
def option(sym, default = nil, &block)
_defmetasyntax("option", _intern(sym), block) {|target|
seq() { default } | seq(sym)
}
end
|
#precedence_table(&block) ⇒ Object
222
223
224
225
226
|
# File 'lib/racc/grammar.rb', line 222
def precedence_table(&block)
env = PrecedenceDefinitionEnv.new(@grammar)
env.instance_eval(&block)
@grammar.end_precedence_declaration env.reverse
end
|
#separated_by(sep, sym, &block) ⇒ Object
307
308
309
|
# File 'lib/racc/grammar.rb', line 307
def separated_by(sep, sym, &block)
option(separated_by1(sep, sym), [], &block)
end
|
#separated_by1(sep, sym, &block) ⇒ Object
311
312
313
314
315
316
|
# File 'lib/racc/grammar.rb', line 311
def separated_by1(sep, sym, &block)
_defmetasyntax("separated_by1", _intern(sym), block) {|target|
seq(sym) {|x| [x] }\
| seq(target, sep, sym) {|list, _, x| list.push x; list }
}
end
|
#seq(*list, &block) ⇒ Object
271
272
273
|
# File 'lib/racc/grammar.rb', line 271
def seq(*list, &block)
Rule.new(nil, list.map {|x| _intern(x) }, UserAction.proc(block))
end
|