374: def newnode(names, options = {})
375: names = [names] unless names.instance_of?(Array)
376: doc = lexer.getcomment
377: names.collect do |name|
378: name = AST::HostName.new :value => name unless name.is_a?(AST::HostName)
379: if other = @loaded_code.node_exists?(name)
380: error("Node %s is already defined at %s:%s; cannot redefine" % [other.name, other.file, other.line])
381: end
382: name = name.to_s if name.is_a?(Symbol)
383: args = {
384: :name => name,
385: :parser => self,
386: :doc => doc,
387: :line => options[:line]
388: }
389: if options[:code]
390: args[:code] = options[:code]
391: end
392: if options[:parent]
393: args[:parentclass] = options[:parent]
394: end
395: node = ast(AST::Node, args)
396: node.classname = name.to_classname
397: @loaded_code.add_node(name, node)
398: node
399: end
400: end