LINUX.ORG.RU

История изменений

Исправление 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();
}