lime/examples/calc.lime

32 lines
989 B
Plaintext

%class calc
%start stmt
%token '+' "plus sign (+)"
%token '/' "division (/)"
%left '+' '-'
%left '*' '/' '%'
%right '^'
%right T_INC
stmt = exp { echo " -> "; echo $1[0] . ' = ' . $1[1]; echo "\n"; }
| var/v '=' exp/e {
echo "$v = $e\n";
set_variable($v, $e);
}
.
exp = num { $$ = array($1, $1); }
| var { $$ = array($1, get_variable($1)); }
| exp '+' exp { $$ = array('(' . $1[0] . ' + ' . $3[0] . ')', $1[1] + $3[1]); }
| exp '-' exp { $$ = array('(' . $1[0] . ' - ' . $3[0] . ')', $1[1] - $3[1]); }
| exp '*' exp { $$ = array('(' . $1[0] . ' * ' . $3[0] . ')', $1[1] * $3[1]); }
| exp '/' exp { $$ = array('(' . $1[0] . ' / ' . $3[0] . ')', $1[1] / $3[1]); }
| exp '^' exp { $$ = array('(' . $1[0] . ' ^ ' . $3[0] . ')', pow($1[1], $3[1])); }
| exp '%' exp { $$ = array('(' . $1[0] . ' % ' . $3[0] . ')', $1[1] % $3[1]); }
| '+' exp %prec T_INC { $$ = array('(+ ' . $2[0] . ')', +($2[1])); }
| '-' exp %prec T_INC { $$ = array('(- ' . $2[0] . ')', -($2[1])); }
| '(' exp/$ ')'
.