aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/tests/calc2test.y
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/tests/calc2test.y')
-rw-r--r--gfsm/gfsm/src/libgfsm/tests/calc2test.y89
1 files changed, 89 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/tests/calc2test.y b/gfsm/gfsm/src/libgfsm/tests/calc2test.y
new file mode 100644
index 0000000..4754613
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/tests/calc2test.y
@@ -0,0 +1,89 @@
+/*======================================================================
+ * Bison Options
+ */
+%pure_parser
+
+%{
+/*======================================================================
+ * Bison C Header
+ */
+#include <stdio.h>
+#include <gfsmScanner.h>
+#include "calc2test.tab.h"
+#include "calc2test.lex.h"
+
+typedef struct calc2testDataS {
+ gfsmScanner scanner;
+ double val;
+} calc2testData;
+
+#define YYLEX_PARAM ((calc2testData*)pparam)->scanner.yyscanner
+#define YYPARSE_PARAM pparam
+
+#define YYERROR_VERBOSE 1
+#define calc2test_yyerror(msg) \
+ gfsm_scanner_carp((gfsmScanner*)pparam, (msg));
+
+%}
+
+/*======================================================================
+ * Bison Definitions
+ */
+%union {
+ double dbl;
+}
+
+%token <dbl> NUMBER PLUS MINUS TIMES DIV LPAREN RPAREN NEWLINE OTHER
+%type <dbl> expr exprs
+
+%left PLUS MINUS
+%left TIMES DIV
+%nonassoc UMINUS
+
+/*======================================================================
+ * Bison Rules
+ */
+%%
+
+exprs: /* empty */
+ { $$=0; }
+ | exprs expr NEWLINE
+ { printf("%g\n", $2); ((calc2testData*)pparam)->val=$$=$2; }
+ ;
+
+expr: LPAREN expr RPAREN { $$=$2; }
+ | MINUS expr { $$=-$2; }
+ | expr TIMES expr { $$=$1*$3; }
+ | expr DIV expr { $$=$1/$3; }
+ | expr PLUS expr { $$=$1+$3; }
+ | expr MINUS expr %prec UMINUS { $$=$1-$3; }
+ | NUMBER { $$=$1; }
+ ;
+
+%%
+
+/*======================================================================
+ * User C Code
+ */
+
+void calc2test_yyerror_func(const char *msg)
+{
+ fprintf(stderr, "yyerror: %s\n", msg);
+}
+
+
+int main (void) {
+ calc2testData *pparams = g_new0(calc2testData,1);
+ gfsm_scanner_init((gfsmScanner*)pparams, "calctest2Scanner", calc2test_yy);
+
+ calc2test_yyparse(pparams);
+ if (pparams->scanner.err) {
+ fprintf(stderr, "Error: %s\n", pparams->scanner.err->message);
+ }
+
+ printf("Final calctest value=%g\n", pparams->val);
+
+ gfsm_scanner_free((gfsmScanner*)pparams);
+
+ return 0;
+}