mirror of https://github.com/vitalif/lime
29 lines
935 B
Plaintext
29 lines
935 B
Plaintext
%class calc
|
|
%start stmt
|
|
|
|
%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/$ ')'
|
|
.
|