# vim: syntax=ruby

require 'yaml' require 'puppetdb'

class PuppetDB::Lexer macro STR [w_:] rule

\s                # whitespace no action
\(                { [:LPAREN, text] }
\)                { [:RPAREN, text] }
\[                { [:LBRACK, text] }
\]                { [:RBRACK, text] }
\{                { [:LBRACE, text] }
\}                { [:RBRACE, text] }
=                 { [:EQUALS, text] }
\!=               { [:NOTEQUALS, text] }
~                 { [:MATCH, text] }
\!~               { [:NOTMATCH, text] }
<=                { [:LESSTHANEQ, text] }
<                 { [:LESSTHAN, text] }
>=                { [:GREATERTHANEQ, text] }
>                 { [:GREATERTHAN, text] }
\*                { [:ASTERISK, text] }
\#                { [:HASH, text] }
\.                { [:DOT, text] }
not(?!{STR})      { [:NOT, text] }
and(?!{STR})      { [:AND, text] }
or(?!{STR})       { [:OR, text] }
true(?!{STR})     { [:BOOLEAN, true]}
false(?!{STR})    { [:BOOLEAN, false]}
-?\d+             { [:NUMBER, text.to_i] }
\"(\\.|[^\\"])*\" { [:STRING, YAML.load(text)] }
\'(\\.|[^\\'])*\' { [:STRING, YAML.load(text)] }
{STR}+            { [:STRING, text] }
@@                { [:EXPORTED, text] }
@                 { [:AT, text] }

end