Skip to content

Instantly share code, notes, and snippets.

@timo
Created May 10, 2019 12:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timo/b66d080aca39b51d94b8e5f36e373969 to your computer and use it in GitHub Desktop.
Save timo/b66d080aca39b51d94b8e5f36e373969 to your computer and use it in GitHub Desktop.
use Grammar::Tracer;
my $testprog = q:to/CONFPROG/;
version = 1
entry profiler_static:
profile |= sf.name eq "florble";
profile |= sf.name eq "blorb";
custom_var = (sf.name eq "blurb") and (frame.caller.name eq "blop")
profile |= custom_var
CONFPROG
die "only support version 1" unless $testprog.lines.head ~~ m/^version \s+ "=" \s+ 1 \s* ";"? $/;
grammar ConfProg {
regex TOP {
"version" \s* "=" \s* "1" \n
<statement>+ %% <.eol>
}
regex eol { \s* ';' \n* | \s* \n+ | \s* \n* $$ }
proto regex statement { * }
regex statement:<var_update> {
<variable> \s+ <update_op> \s+ <expression>
}
regex statement:<entrypoint> {
'entry' \s+ $<entrypoint>=[
| 'profiler_static'
| 'profiler_dynamic'
| 'spesh'
| 'jit'
] \s*
":"
}
regex statement:<label> {
<ident> \s* ':'
}
proto regex variable { * }
regex variable:<custom> {
'$' <.ident>
}
regex variable:<builtin> {
<.ident>
}
proto regex update_op { * }
regex update_op:<logical> {
'|=' | '&='
}
regex update_op:<assignment> {
'='
}
proto regex expression { * }
proto regex one_expression { * }
regex one_expression:<literal_number> {
<[1..9]> '_'? <[0..9]>* % '_'?
}
regex one_expression:<literal_number_base16> {
"0x" <[1..9a..fA..F]> '_'? <[0..9a..fA..F]>* % '_'?
}
regex one_expression:<literal_string> {
| '"' [ <-["]> | \\ \" ]+ '"'
| "'" [ <-[']> | \\ \' ]+ "'"
}
regex one_expression:<drilldown> {
<variable> <postfixish>+
}
regex one_expression:<variable> {
<variable>
}
regex expression:<one> {
<!before '('> <one_expression>
}
regex expression:<comparison> {
<one_expression> \s* <compop> \s* <one_expression>
}
regex one_expression:<parenthesized> {
'(' \s* <expression> \s* ')'
}
regex one_expression:<prefixed> {
<prefixop> '(' \s* <expression> \s* ')'
}
proto regex postfixish { * }
regex postfixish:<attribute> {
'.' <.ident>
}
regex postfixish:<positional> {
'.' "[" <.one_expression> "]"
}
regex compop {
[
| "eq"
| "ne"
| '&&'
| '||'
| "and"
| "or"
]
}
regex prefixop {
[
| '!'
]
}
}
ConfProg.parse($testprog).say;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment