Add another version which uses ordinary LR(1) syntax rather than precedences master origin/master
authorNick Downing <downing.nick@gmail.com>
Thu, 21 Jun 2018 13:20:12 +0000 (23:20 +1000)
committerNick Downing <downing.nick@gmail.com>
Thu, 21 Jun 2018 13:20:12 +0000 (23:20 +1000)
.gitignore
Makefile
calc2.y [new file with mode: 0644]

index c41a4fd..e200888 100644 (file)
@@ -6,3 +6,6 @@ calc
 calc.tab.c
 calc.tab.h
 calc.yy.c
+calc2
+calc2.tab.c
+calc2.tab.h
index b1c5ad5..67e3207 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-all: cal calc
+all: cal calc calc2
 
 # cal program
 cal: y.tab.o
@@ -24,6 +24,14 @@ calc.yy.o: calc.yy.c calc.tab.h
 calc.yy.c: calc.l
        flex -o $@ $<
 
+# calc2 program
+calc2: calc2.tab.o calc.yy.o
+       gcc -o $@ calc2.tab.o calc.yy.o
+
+calc2.tab.h: calc2.tab.c
+calc2.tab.c: calc2.y
+       bison -d $<
+
 # other
 clean:
-       rm -f *.o cal lex.yy.c y.tab.c calc calc.tab.c calc.tab.h calc.yy.c
+       rm -f *.o cal lex.yy.c y.tab.c calc calc.tab.c calc.tab.h calc.yy.c calc2 calc2.tab.c calc2.tab.h
diff --git a/calc2.y b/calc2.y
new file mode 100644 (file)
index 0000000..9f7be4d
--- /dev/null
+++ b/calc2.y
@@ -0,0 +1,41 @@
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#define YYSTYPE double
+%}
+
+%token NUM
+
+%%
+
+S : S E '\n' { printf("Answer: %g\nEnter:\n", $2); }
+  | S '\n'
+  |
+  | error '\n' { yyerror("Error: Enter once more...\n"); yyerrok; }
+  ;
+E : E '+' F { $$ = $1 + $3; }
+  | E '-' F { $$ = $1 - $3; }
+  | F
+  ;
+F : F '*' G { $$ = $1 * $3; }
+  | F '/' G { $$ = $1 / $3; }
+  | G
+  ;
+G : '(' E ')' { $$ = $2; }
+  | '-' G { $$ = -$2; }
+  | NUM
+  ;
+
+%%
+
+int main()
+{
+  printf("Enter the expression:\n");
+  yyparse();
+}
+
+yyerror(char * s)
+{
+  printf("%s\n", s);
+  exit(EXIT_FAILURE);
+}