Object
# File racc/grammar.rb, line 242
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
# File racc/grammar.rb, line 262
def _added?(sym)
@grammar.added?(sym) or @delayed.detect {|r| r.target == sym }
end
# File racc/grammar.rb, line 258
def _delayed_add(rule)
@delayed.push rule
end
# File racc/grammar.rb, line 321
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
# File racc/grammar.rb, line 282
def action(&block)
id = "@#{@seqs["action"] += 1}".intern
_delayed_add Rule.new(@grammar.intern(id), [], UserAction.proc(block))
id
end
# File racc/grammar.rb, line 266
def flush_delayed
return if @delayed.empty?
@delayed.each do |rule|
@grammar.add rule
end
@delayed.clear
end
# File racc/grammar.rb, line 214
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
# File racc/grammar.rb, line 296
def many(sym, &block)
_defmetasyntax("many", _intern(sym), block) {|target|
seq() { [] } | seq(target, sym) {|list, x| list.push x; list }
}
end
# File racc/grammar.rb, line 303
def many1(sym, &block)
_defmetasyntax("many1", _intern(sym), block) {|target|
seq(sym) {|x| [x] } | seq(target, sym) {|list, x| list.push x; list }
}
end
# File racc/grammar.rb, line 231
def method_missing(mid, *args, &block)
unless mid.to_s[-1,1] == '='
super # raises NoMethodError
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
# File racc/grammar.rb, line 278
def null(&block)
seq(&block)
end
# File racc/grammar.rb, line 290
def option(sym, default = nil, &block)
_defmetasyntax("option", _intern(sym), block) {|target|
seq() { default } | seq(sym)
}
end
# File racc/grammar.rb, line 225
def precedence_table(&block)
env = PrecedenceDefinitionEnv.new(@grammar)
env.instance_eval(&block)
@grammar.end_precedence_declaration env.reverse
end
# File racc/grammar.rb, line 310
def separated_by(sep, sym, &block)
option(separated_by1(sep, sym), [], &block)
end