История изменений
Исправление beastie, (текущая версия) :
Мне больно на это смотреть ... :( Вот тебе примитивный RPN калькулятор:
%{
#include <err.h>
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE int
%}
%token NUMBER
%%
stmt
: /* empty */
| stmt expr '\n' { printf("\t%d\n", $2); }
| stmt error '\n' { yyerrok; }
;
expr
: number { $$ = $1; }
| expr number '+' { $$ = $1 + $2; }
| expr number '-' { $$ = $1 - $2; }
| expr number '*' { $$ = $1 * $2; }
| expr number '/' { $$ = $1 / $2; }
;
number
: NUMBER { $$ = $1; }
| '-' NUMBER { $$ = -$2; }
;
%%
int
yyerror(char *s)
{
warnx(s);
}
int
yylex()
{
int c;
while ((c = getchar()) == ' ' || c == '\t')
;
if (c == EOF)
return 0;
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%li", &yylval);
return NUMBER;
}
return c;
}
int
main ()
{
yyparse();
}
Исправление beastie, :
Мне больно на это смотреть ... :( Вот тебе примитивный RPN калькулятор:
%{
#include <err.h>
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE int
%}
%token NUMBER
%%
stmt
: /* empty */
| stmt expr '\n' { printf("\t%d\n", $2); }
| stmt error '\n' { yyerrok; }
;
expr
: number { $$ = $1; }
| expr number '+' { $$ = $1 + $2; }
| expr number '-' { $$ = $1 - $2; }
| expr number '*' { $$ = $1 * $2; }
| expr number '/' { $$ = $1 / $2; }
;
number
: NUMBER { $$ = $1; }
| '-' NUMBER { $$ = -$2; }
;
%%
int
yyerror (const char *s)
{
warnx(s);
}
int
yylex()
{
int c;
while ((c = getchar()) == ' ' || c == '\t')
;
if (c == EOF)
return 0;
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%li", &yylval);
return NUMBER;
}
return c;
}
int
main ()
{
yyparse();
}
Исходная версия beastie, :
Мне больно на это смотреть ... :( Вот тебе примитивный RPN калькулятор:
%{
#include <err.h>
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE int
%}
%token NUMBER
%%
stmt
: /* empty */
| stmt expr '\n' { printf("\t%d\n", $2); }
| stmt error '\n' { yyerrok; }
;
expr
: number { $$ = $1; }
| expr number '+' { $$ = $1 + $2; }
| expr number '-' { $$ = $1 - $2; }
| expr number '*' { $$ = $1 * $2; }
| expr number '/' { $$ = $1 / $2; }
;
number
: NUMBER { $$ = $1; }
| '-' NUMBER { $$ = -$2; }
;
%%
int
yyerror (const char *s)
{
warnx(s);
}
int
yylex(void)
{
int c;
while ((c = getchar()) == ' ' || c == '\t')
;
if (c == EOF)
return 0;
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%li", &yylval);
return NUMBER;
}
return c;
}
int
main ()
{
yyparse();
}