Skip to content

Instantly share code, notes, and snippets.

Created June 8, 2009 11:52
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 anonymous/125772 to your computer and use it in GitHub Desktop.
Save anonymous/125772 to your computer and use it in GitHub Desktop.
grammar Grmmr
{
rule TOP
{
<suite>
{*}
};
token suite
{
<var_stmt> \n <var_stmt>
{*}
};
token var_stmt
{
'var ' <identifier> ' ' <assignoperator> ' ' <expression>
{*}
};
token identifier
{
<[a..z]> \w*
{*}
};
token assignoperator
{
| '=' {*} #= assign
| '+=' {*} #= add
| '-=' {*} #= sub
| '*=' {*} #= mul
| '/=' {*} #= div
| '\%=' {*} #= mod
| '||=' {*} #= or
| '&&=' {*} #= and
};
token expression
{
<or_test>
{*}
};
token or_test
{
<xor_test> [ 'or' <xor_test> ]*
{*}
};
token xor_test
{
<and_test> [ 'xor' <and_test> ]*
{*}
};
token and_test
{
<not_test> [ 'and' <not_test> ]*
{*}
};
token not_test
{
['not']? <comparison>
{*}
};
token comparison
{
<variable> ** <operator>
{*}
};
token variable
{
| <identifier> {*} #= identifier
| <number> {*} #= number
| <string> {*} #= string
};
token number
{
\d+ [ '.' \d+ ]? {*}
};
token string
{
'"' .* '"' {*}
};
token operator
{
| '~' {*} #= concat
| '+' {*} #= plus
| '-' {*} #= sub
| '*' {*} #= mul
| '/' {*} #= div
| '%' {*} #= mod
| '==' {*} #= eq
| '!=' {*} #= ne
| '<=' {*} #= leq
| '>=' {*} #= geq
| '<' {*} #= lt
| '>' {*} #= gt
};
};
my $action = Actions.new(); Grmmr.parse("var alpha = 3 + 8\nvar beta += 7", :action($action));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment