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