File: //var/cache/puppet/lib/puppetdb/grammar.racc
# vim: syntax=ruby
class PuppetDB::Parser
token LPAREN RPAREN LBRACK RBRACK LBRACE RBRACE
token EQUALS NOTEQUALS MATCH NOTMATCH
token LESSTHAN LESSTHANEQ GREATERTHAN GREATERTHANEQ
token AT HASH ASTERISK DOT
token NOT AND OR
token NUMBER STRING BOOLEAN EXPORTED
prechigh
right NOT
left EQUALS MATCH LESSTHAN GREATERTHAN
left AND
left OR
preclow
options no_result_var
rule
query
: expression
|
expression
: identifier_path { ASTNode.new :regexp_node_match, val[0] }
| NOT expression { ASTNode.new :booleanop, :not, [val[1]] }
| expression AND expression { ASTNode.new :booleanop, :and, [val[0], val[2]] }
| expression OR expression { ASTNode.new :booleanop, :or, [val[0], val[2]] }
| LPAREN expression RPAREN { val[1] }
| resource_expression
| comparison_expression
| subquery
literal
: boolean { ASTNode.new :boolean, val[0] }
| string { ASTNode.new :string, val[0] }
| integer { ASTNode.new :number, val[0] }
| float { ASTNode.new :number, val[0] }
| AT string { ASTNode.new :date, val[1] }
comparison_op
: MATCH
| NOTMATCH
| EQUALS
| NOTEQUALS
| GREATERTHAN
| GREATERTHANEQ
| LESSTHAN
| LESSTHANEQ
comparison_expression
: identifier_path comparison_op literal { ASTNode.new :comparison, val[1], [val[0], val[2]] }
identifier
: string { ASTNode.new :identifier, val[0] }
| integer { ASTNode.new :identifier, val[0] }
| MATCH string { ASTNode.new :regexp_identifier, val[1] }
| ASTERISK { ASTNode.new :regexp_identifier, '.*' }
identifier_path
: identifier { ASTNode.new :identifier_path, nil, [val[0]] }
| identifier_path DOT identifier { val[0].children.push val[2]; val[0] }
subquery
: HASH string DOT comparison_expression { ASTNode.new :subquery, val[1], [val[3]] }
| HASH string block_expression { ASTNode.new :subquery, val[1], [val[2]] }
block_expression
: LBRACE expression RBRACE { val[1] }
resource_expression
: string LBRACK identifier RBRACK
{ ASTNode.new :resource, {:type => val[0], :title => val[2], :exported => false} }
| string LBRACK identifier RBRACK block_expression
{ ASTNode.new :resource, {:type => val[0], :title => val[2], :exported => false}, [val[4]] }
| EXPORTED string LBRACK identifier RBRACK
{ ASTNode.new :resource, {:type => val[1], :title => val[3], :exported => true} }
| EXPORTED string LBRACK identifier RBRACK block_expression
{ ASTNode.new :resource, {:type => val[1], :title => val[3], :exported => true}, [val[5]] }
boolean: BOOLEAN
integer: NUMBER
string: STRING
float: NUMBER DOT NUMBER { "#{val[0]}.#{val[2]}".to_f }
end
---- inner
include PuppetDB::ParserHelper
---- header
require 'puppetdb'
require 'puppetdb/lexer'
require 'puppetdb/astnode'
require 'puppetdb/parser_helper'