class Puppet::Parser::Parser

Constants

AST
Racc_arg
Racc_debug_parser
Racc_token_to_s_table

Attributes

environment[R]
files[RW]
lexer[RW]
version[R]

Public Instance Methods

_reduce_none(val, _values, result) click to toggle source
# File lib/puppet/parser/parser.rb, line 2553
def _reduce_none(val, _values, result)
  val[0]
end
addcontext(message, obj = nil) click to toggle source

Add context to a message; useful for error messages and such.

# File lib/puppet/parser/parser_support.rb, line 25
def addcontext(message, obj = nil)
  obj ||= @lexer

  message += " on line #{obj.line}"
  if file = obj.file
    message += " in file #{file}"
  end

  message
end
aryfy(arg) click to toggle source

Create an AST array containing a single element

# File lib/puppet/parser/parser_support.rb, line 37
def aryfy(arg)
  ast AST::ASTArray, :children => [arg]
end
ast(klass, hash = {}) click to toggle source

Create an AST object, and automatically add the file and line information if available.

# File lib/puppet/parser/parser_support.rb, line 48
def ast(klass, hash = {})
  klass.new ast_context(klass.use_docs, hash[:line]).merge(hash)
end
ast_context(include_docs = false, ast_line = nil) click to toggle source
# File lib/puppet/parser/parser_support.rb, line 52
def ast_context(include_docs = false, ast_line = nil)
  result = {
    :line => ast_line || lexer.line,
    :file => lexer.file
  }
  result[:doc] = lexer.getcomment(result[:line]) if include_docs
  result
end
block(arg) click to toggle source

Create an AST block containing a single element

# File lib/puppet/parser/parser_support.rb, line 42
def block(arg)
  ast AST::BlockExpression, :children => [arg]
end
classname(name) click to toggle source

The fully qualifed name, with the full namespace.

# File lib/puppet/parser/parser_support.rb, line 62
def classname(name)
  [@lexer.namespace, name].join("::").sub(/^::/, '')
end
clear() click to toggle source
# File lib/puppet/parser/parser_support.rb, line 66
def clear
  initvars
end
error(message, options = {}) click to toggle source

Raise a Parse error.

# File lib/puppet/parser/parser_support.rb, line 71
def error(message, options = {})
  if @lexer.expected
    message += "; expected '%s'"
  end
  except = Puppet::ParseError.new(message)
  except.line = options[:line] || @lexer.line
  except.file = options[:file] || @lexer.file

  raise except
end
file=(file) click to toggle source
# File lib/puppet/parser/parser_support.rb, line 84
def file=(file)
  unless Puppet::FileSystem.exist?(file)
    unless file =~ /\.pp$/
      file = file + ".pp"
    end
  end
  raise Puppet::AlreadyImportedError, "Import loop detected for #{file}" if known_resource_types.watching_file?(file)

  watch_file(file)
  @lexer.file = file
end
import(file) click to toggle source
# File lib/puppet/parser/parser_support.rb, line 100
def import(file)
  deprecation_location_text =
  if @lexer.file && @lexer.line
    " at #{@lexer.file}:#{@lexer.line}"
  elsif @lexer.file
    " in file #{@lexer.file}"
  elsif @lexer.line
    " at #{@lexer.line}"
  end

  Puppet.deprecation_warning("The use of 'import' is deprecated#{deprecation_location_text}. See http://links.puppetlabs.com/puppet-import-deprecation")
  if @lexer.file
    # use a path relative to the file doing the importing
    dir = File.dirname(@lexer.file)
  else
    # otherwise assume that everything needs to be from where the user is
    # executing this command. Normally, this would be in a "puppet apply -e"
    dir = Dir.pwd
  end

  known_resource_types.loader.import(file, dir)
end
initvars() click to toggle source

Initialize or reset all of our variables.

# File lib/puppet/parser/parser_support.rb, line 129
def initvars
  @lexer = Puppet::Parser::Lexer.new
end
namesplit(fullname) click to toggle source

Split an fq name into a namespace and name

# File lib/puppet/parser/parser_support.rb, line 134
def namesplit(fullname)
  ary = fullname.split("::")
  n = ary.pop || ""
  ns = ary.join("::")
  return ns, n
end
on_error(token,value,stack) click to toggle source
# File lib/puppet/parser/parser_support.rb, line 141
def on_error(token,value,stack)
  if token == 0 # denotes end of file
    value = 'end of file'
  else
    value = "'#{value[:value]}'"
  end
  error = "Syntax error at #{value}"

  if brace = @lexer.expected
    error += "; expected '#{brace}'"
  end

  except = Puppet::ParseError.new(error)
  except.line = @lexer.line
  except.file = @lexer.file if @lexer.file

  raise except
end
parse(string = nil) click to toggle source

how should I do error handling here?

# File lib/puppet/parser/parser_support.rb, line 161
def parse(string = nil)
  if self.file =~ /\.rb$/
    main = parse_ruby_file
  else
    self.string = string if string
    begin
      @yydebug = false
      main = yyparse(@lexer,:scan)
    rescue Puppet::ParseError => except
      except.line ||= @lexer.line
      except.file ||= @lexer.file
      except.pos ||= @lexer.pos
      raise except
    rescue => except
      raise Puppet::ParseError.new(except.message, @lexer.file, @lexer.line, nil, except)
    end
  end
  # Store the results as the top-level class.
  return Puppet::Parser::AST::Hostclass.new('', :code => main)
ensure
  @lexer.clear
end
parse_ruby_file() click to toggle source
# File lib/puppet/parser/parser_support.rb, line 184
def parse_ruby_file
  Puppet.deprecation_warning("Use of the Ruby DSL is deprecated.")

  # Execute the contents of the file inside its own "main" object so
  # that it can call methods in the resource type API.
  main_object = Puppet::DSL::ResourceTypeAPI.new
  main_object.instance_eval(File.read(self.file))

  # Then extract any types that were created.
  Puppet::Parser::AST::BlockExpression.new :children => main_object.instance_eval { @__created_ast_objects__ }
end

Public Class Methods

new(env) click to toggle source
# File lib/puppet/parser/parser_support.rb, line 123
def initialize(env)
  @environment = env
  initvars
end