自作コンパイラの部屋 > yacc入門 > yaccを使ってみる > 電卓第一版

電卓第一版

以下は、yaccのためのソースファイル、parser.yです

parser.y
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "calc.h"
%}
%token	NUM

%left	'-' '+' '*' '/'

%%
input: /* empty*/
	| input line
	;

line:	'\n'
	| exp '\n'	{ printf("%d\n", $1); }
	;

exp: NUM
	| exp '+' exp	{ $$ = $1 + $3; }
	| exp '-' exp	{ $$ = $1 - $3; }
	| exp '*' exp	{ $$ = $1 * $3; }
	| exp '/' exp	{ $$ = $1 / $3; }
	;

%%

以下は、main関数など、yaccの呼び出し部分です。

main.c
#include <stdio.h>
#include "calc.h"

int main()	/* main:yaccの呼び出し */
{
	return yyparse();
}

int yyerror(const char *s)	/* エラー表示 */
{
	printf("ERROR: %s\n", s);
	return 0;
}

以下は字句解析ルーチンです。

lex.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#ifdef UNIX
#include "parser.tab.h"
#else
#include "parser.h"
#endif

int yylex()	/* 字句解析ルーチンはyylexという関数にする */
{
	int c = getchar();
	if (isdigit(c)) {
		char buff[128];
		char *p = buff;
		do {
			*p++ = c;
			c = getchar();
		} while (isdigit(c));
		ungetc(c, stdin);
		*p = '\0';
		yylval = atoi(buff);
		return NUM;
	}
	return c;
}

ヘッダです。

calc.h
#ifndef _CALC_H
#define _CALC_H
int yylex(void);
int yyerror(const char *s);
int yyparse(void);
#endif

以下はmakefileです。ソースはWindows/UNIX共通ですが、makefileにより両者を切り分けています。まずはWindows用のmakefile。コンパイラは、BorlndC++5.5を想定しています。

makefile(Windows用)
OBJS=parser.obj main.obj lex.obj
.c.obj:
	bcc32 -c $<

calc.exe: $(OBJS)
	bcc32 -ecalc.exe $(OBJS)

parser.c : parser.y
	kmyacc -d -b parser parser.y

お次は、UNIX用

makefile(UNIX用)
#
CFLAGS=-DUNIX
OBJS = parser.tab.o main.o lex.o 

calc: $(OBJS)
	$(CC) -o calc $(OBJS)

parser.tab.c: parser.y
	bison -d -b parser parser.y

Last update: '2000年06月04日