Home | History | Annotate | Download | only in lib
      1 #include <stdio.h>
      2 #include "STreeParser.h"
      3 
      4 void STreeParser::
      5 MATCH(SORASTBase *_t,int tok)
      6 {
      7 	if ( _t->type()!=tok )
      8 	{
      9 		if ( guessing ) _GUESS_FAIL;
     10 		else mismatched_token(tok, _t);
     11 	}
     12 }
     13 
     14 void STreeParser::
     15 MATCHRANGE(SORASTBase *_t,int tok,int tok2)
     16 {
     17 	if ( _t->type()<tok || _t->type()>tok2 )
     18 	{
     19 		if ( guessing ) _GUESS_FAIL;
     20 		else mismatched_range(tok, tok2, _t);
     21 	}
     22 }
     23 
     24 void STreeParser::
     25 WILDCARD(SORASTBase *_t)
     26 {
     27 	if ( _t==NULL )
     28 	{
     29 		if ( guessing ) _GUESS_FAIL;
     30 		else missing_wildcard();
     31 	}
     32 }
     33 
     34 void STreeParser::
     35 mismatched_range(int looking_for, int upper_token, SORASTBase *found)
     36 {
     37 	if ( found!=NULL ) {
     38 		fprintf(stderr,
     39 				"parse error: expected token range %d..%d found token %d\n",
     40 				looking_for, upper_token,
     41 				found->type());
     42 	}
     43 	else {
     44 		fprintf(stderr,
     45 				"parse error: expected token range %d..%d found NULL tree\n",
     46 				looking_for, upper_token);
     47 	}
     48 }
     49 
     50 void STreeParser::
     51 missing_wildcard()
     52 {
     53 	fprintf(stderr, "parse error: expected any token/tree found found NULL tree\n");
     54 }
     55 
     56 void STreeParser::
     57 mismatched_token(int looking_for, SORASTBase *found)
     58 {
     59 	if ( found!=NULL ) {
     60 		fprintf(stderr,
     61 				"parse error: expected token %d found token %d\n",
     62 				looking_for,
     63 				found->type());
     64 	}
     65 	else {
     66 		fprintf(stderr,
     67 				"parse error: expected token %d found NULL tree\n",
     68 				looking_for);
     69 	}
     70 }
     71 
     72 void STreeParser::
     73 no_viable_alt(char *rulename, SORASTBase *root)
     74 {
     75 	if ( root==NULL )
     76 		fprintf(stderr,
     77 				"parse error: in rule %s, no viable alternative for NULL tree\n",
     78 				rulename);
     79 	else
     80 		fprintf(stderr,
     81 				"parse error: in rule %s, no viable alternative for tree\n",
     82 				rulename);
     83 }
     84 
     85 void STreeParser::
     86 panic(char *err)
     87 {
     88 	fprintf(stderr, "panic: %s\n", err);
     89 	exit(-1);
     90 }
     91 
     92 void STreeParser::
     93 save_state(STreeParser *buf)
     94 {
     95 	buf->try_ok = this->try_ok;
     96 	buf->sjrv = this->sjrv;
     97 	buf->guessing = this->guessing;
     98 	buf->startofguess = this->startofguess;
     99 }
    100 
    101 void STreeParser::
    102 restore_state(STreeParser *buf)
    103 {
    104 	this->try_ok = buf->try_ok;
    105 	this->sjrv = buf->sjrv;
    106 	this->guessing = buf->guessing;
    107 	this->startofguess = buf->startofguess;
    108 }
    109 
    110 void STreeParser::
    111 _mkroot(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)
    112 {
    113 	*r = t;
    114 }
    115 
    116 void STreeParser::
    117 _mkchild(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)
    118 {
    119 #ifdef BEFORE_GARYS_FIX
    120 	/* if no sibling list, must attach to any existing root */
    121 	if ( *s==NULL )
    122 	{
    123 		*s = *e = t;
    124 		/* If r is NULL, then there was no root defined--must be sibling list */
    125 		if ( *r==NULL ) *r = *s;
    126 		else (*r)->setDown(t);
    127 	}
    128 	else { (*e)->setRight(t); *e = t; }
    129 #endif
    130 /*
    131 	should do nothing if asked to add a NULL argument.  NULL's come up
    132 	when a rule wants to return "nothing".
    133 */
    134 	/* if no sibling list, must attach to any existing root */
    135 	if (*s == NULL)
    136 	{
    137 		*s = *e = t;
    138 		// If r is NULL then there was no root defined--must be sibling list
    139 		if (*r == NULL)	*r = *s;
    140 		else (*r)->setDown(t);
    141 	}
    142 	else if (*e != NULL)
    143 	{
    144 		(*e)->setRight(t);
    145 		*e = t;
    146 	}
    147 	if (*e != NULL) {
    148 		while ((*e)->right() != NULL) *e = (SORASTBase *)(*e)->right();
    149 	}
    150 }
    151 
    152