1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
%{
%}
%token NUMBER EOL
%left '+' '-'
%left '*' '/'
%%
start: |
start input
;
input: expr EOL { print $1 . "\n"; }
| EOL
;
expr: NUMBER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '(' expr ')' { $$ = $2; }
;
%%
# $Id: calc.y,v 1.1 2002/04/10 04:58:09 srz Exp $
sub yylex
{
my ($s) = @_;
my ($c, $val);
while (($c = $s->getc) eq ' ' || $c eq "\t") {
}
if ($c eq '') {
return 0;
}
elsif ($c eq "\n") {
return $EOL;
}
elsif ($c =~ /[0-9]/) {
$val = $c;
while (($c = $s->getc) =~ /[0-9]/) {
$val .= $c;
}
$s->ungetc;
return ($NUMBER, $val);
}
else {
return ord($c);
}
}
sub yyerror {
my ($msg, $s) = @_;
die "$msg at " . $s->name . " line " . $s->lineno . ".\n";
}
|