--- /dev/null
+#include <stdio.h>\r
+#include "STreeParser.h"\r
+\r
+void STreeParser::\r
+MATCH(SORASTBase *_t,int tok)\r
+{\r
+ if ( _t->type()!=tok )\r
+ {\r
+ if ( guessing ) _GUESS_FAIL;\r
+ else mismatched_token(tok, _t);\r
+ }\r
+}\r
+\r
+void STreeParser::\r
+MATCHRANGE(SORASTBase *_t,int tok,int tok2)\r
+{\r
+ if ( _t->type()<tok || _t->type()>tok2 )\r
+ {\r
+ if ( guessing ) _GUESS_FAIL;\r
+ else mismatched_range(tok, tok2, _t);\r
+ }\r
+}\r
+\r
+void STreeParser::\r
+WILDCARD(SORASTBase *_t)\r
+{\r
+ if ( _t==NULL )\r
+ {\r
+ if ( guessing ) _GUESS_FAIL;\r
+ else missing_wildcard();\r
+ }\r
+}\r
+\r
+void STreeParser::\r
+mismatched_range(int looking_for, int upper_token, SORASTBase *found)\r
+{\r
+ if ( found!=NULL ) {\r
+ fprintf(stderr,\r
+ "parse error: expected token range %d..%d found token %d\n",\r
+ looking_for, upper_token,\r
+ found->type());\r
+ }\r
+ else {\r
+ fprintf(stderr,\r
+ "parse error: expected token range %d..%d found NULL tree\n",\r
+ looking_for, upper_token);\r
+ }\r
+}\r
+\r
+void STreeParser::\r
+missing_wildcard()\r
+{\r
+ fprintf(stderr, "parse error: expected any token/tree found found NULL tree\n");\r
+}\r
+\r
+void STreeParser::\r
+mismatched_token(int looking_for, SORASTBase *found)\r
+{\r
+ if ( found!=NULL ) {\r
+ fprintf(stderr,\r
+ "parse error: expected token %d found token %d\n",\r
+ looking_for,\r
+ found->type());\r
+ }\r
+ else {\r
+ fprintf(stderr,\r
+ "parse error: expected token %d found NULL tree\n",\r
+ looking_for);\r
+ }\r
+}\r
+\r
+void STreeParser::\r
+no_viable_alt(char *rulename, SORASTBase *root)\r
+{\r
+ if ( root==NULL )\r
+ fprintf(stderr,\r
+ "parse error: in rule %s, no viable alternative for NULL tree\n",\r
+ rulename);\r
+ else\r
+ fprintf(stderr,\r
+ "parse error: in rule %s, no viable alternative for tree\n",\r
+ rulename);\r
+}\r
+\r
+void STreeParser::\r
+panic(char *err)\r
+{\r
+ fprintf(stderr, "panic: %s\n", err);\r
+ exit(-1);\r
+}\r
+\r
+void STreeParser::\r
+save_state(STreeParser *buf)\r
+{\r
+ buf->try_ok = this->try_ok;\r
+ buf->sjrv = this->sjrv;\r
+ buf->guessing = this->guessing;\r
+ buf->startofguess = this->startofguess;\r
+}\r
+\r
+void STreeParser::\r
+restore_state(STreeParser *buf)\r
+{\r
+ this->try_ok = buf->try_ok;\r
+ this->sjrv = buf->sjrv;\r
+ this->guessing = buf->guessing;\r
+ this->startofguess = buf->startofguess;\r
+}\r
+\r
+void STreeParser::\r
+_mkroot(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)\r
+{\r
+ *r = t;\r
+}\r
+\r
+void STreeParser::\r
+_mkchild(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)\r
+{\r
+#ifdef BEFORE_GARYS_FIX\r
+ /* if no sibling list, must attach to any existing root */\r
+ if ( *s==NULL )\r
+ {\r
+ *s = *e = t;\r
+ /* If r is NULL, then there was no root defined--must be sibling list */\r
+ if ( *r==NULL ) *r = *s;\r
+ else (*r)->setDown(t);\r
+ }\r
+ else { (*e)->setRight(t); *e = t; }\r
+#endif\r
+/*\r
+ should do nothing if asked to add a NULL argument. NULL's come up\r
+ when a rule wants to return "nothing".\r
+*/\r
+ /* if no sibling list, must attach to any existing root */\r
+ if (*s == NULL)\r
+ {\r
+ *s = *e = t;\r
+ // If r is NULL then there was no root defined--must be sibling list\r
+ if (*r == NULL) *r = *s;\r
+ else (*r)->setDown(t);\r
+ }\r
+ else if (*e != NULL)\r
+ {\r
+ (*e)->setRight(t);\r
+ *e = t;\r
+ }\r
+ if (*e != NULL) {\r
+ while ((*e)->right() != NULL) *e = (SORASTBase *)(*e)->right();\r
+ }\r
+}\r
+\r