+all: cal calc
+
+# cal program
cal: y.tab.o
${CC} -o $@ $<
lex.yy.c: cal.l
lex $<
+# calc program
+calc: calc.tab.o calc.yy.o
+ gcc -o $@ calc.tab.o calc.yy.o
+
+calc.tab.h: calc.tab.c
+calc.tab.c: calc.y
+ bison -d $<
+
+calc.yy.o: calc.yy.c calc.tab.h
+calc.yy.c: calc.l
+ flex -o $@ $<
+
+# other
clean:
- rm -f *.o cal lex.yy.c y.tab.c
+ rm -f *.o cal lex.yy.c y.tab.c calc calc.tab.c calc.tab.h calc.yy.c
--- /dev/null
+%{
+#define YYSTYPE double
+#include "calc.tab.h"
+%}
+
+DIGIT [0-9]+\.?|[0-9]*\.[0-9]+
+
+%option noyywrap
+
+%%
+
+[ ]
+{DIGIT} { yylval = atof(yytext); return NUM; }
+\n|. { return yytext[0]; }
--- /dev/null
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#define YYSTYPE double
+%}
+
+%token NUM
+
+%left '+' '-'
+%left '*' '/'
+%right UMINUS
+
+%%
+
+S : S E '\n' { printf("Answer: %g\nEnter:\n", $2); }
+ | S '\n'
+ |
+ | error '\n' { yyerror("Error: Enter once more...\n"); yyerrok; }
+ ;
+E : E '+' E { $$ = $1 + $3; }
+ | E '-' E { $$ = $1 - $3; }
+ | E '*' E { $$ = $1 * $3; }
+ | E '/' E { $$ = $1 / $3; }
+ | '(' E ')' { $$ = $2; }
+ | '-' E %prec UMINUS { $$ = -$2; }
+ | NUM
+ ;
+
+%%
+
+int main()
+{
+ printf("Enter the expression:\n");
+ yyparse();
+}
+
+yyerror(char * s)
+{
+ printf("%s\n", s);
+ exit(EXIT_FAILURE);
+}