自作コンパイラの部屋 > 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日