Home | History | Annotate | Download | only in h
      1 #ifndef STreeParser_h
      2 #define STreeParser_h
      3 
      4 /*
      5  * STreeParser.h
      6  *
      7  * SOFTWARE RIGHTS
      8  *
      9  * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public
     10  * domain.  An individual or company may do whatever they wish with
     11  * source code distributed with SORCERER or the code generated by
     12  * SORCERER, including the incorporation of SORCERER, or its output, into
     13  * commerical software.
     14  *
     15  * We encourage users to develop software with SORCERER.  However, we do
     16  * ask that credit is given to us for developing SORCERER.  By "credit",
     17  * we mean that if you incorporate our source code into one of your
     18  * programs (commercial product, research project, or otherwise) that you
     19  * acknowledge this fact somewhere in the documentation, research report,
     20  * etc...  If you like SORCERER and have developed a nice tool with the
     21  * output, please mention that you developed it using SORCERER.  In
     22  * addition, we ask that this header remain intact in our source code.
     23  * As long as these guidelines are kept, we expect to continue enhancing
     24  * this system and expect to make other tools available as they are
     25  * completed.
     26  *
     27  * SORCERER 1.00B
     28  * Parr Research Corporation
     29  * with Purdue University and AHPCRC, University of Minnesota
     30  * 1992-1994
     31  */
     32 
     33 /* The programmer should derive a class from SORASTBase; SORASTBase defines
     34  * the minimum public interface that a tree node must follow for SORCERER to
     35  * be able to walk the trees.
     36  */
     37 
     38 /* The @-vars are added by the subclass created by SORCERER; the constructor
     39  * is used to init the @-vars.
     40  */
     41 
     42 #include <stdio.h>
     43 #include <setjmp.h>
     44 #include <stdlib.h>
     45 #include "SASTBase.h"
     46 
     47 #define _DOWN        _t=(SORASTBase *)_t->down()
     48 #define _RIGHT        _t=(SORASTBase *)_t->right()
     49 
     50 #define _SAVE        SORASTBase *_save=_t
     51 #define _RESTORE      _t = _save
     52 #define _GUESS_BLOCK    STreeParser _st; int _gv; SORASTBase *_savet=NULL;
     53 #define _GUESS        {save_state(&_st); \
     54               _savet = _t; \
     55               guessing = 1; \
     56               _gv = setjmp(startofguess.state);}
     57 #define _GUESS_FAIL      longjmp(startofguess.state, 1)
     58 #define _GUESS_DONE      {restore_state(&_st); _t = _savet;}
     59 #define _MATCH(tok)      MATCH(_t,tok)
     60 #define _MATCHRANGE(t1,t2)  MATCHRANGE(_t,t1,t2)
     61 #define _WILDCARD      WILDCARD(_t)
     62 
     63 #define ast_return(t)    *_result = (SORASTBase *)t;
     64 
     65 #define STreeTry(r,p,t)     \
     66       (p)->try_result = NULL;          \
     67             (p)->sjrv = setjmp((p)->startofguess);  \
     68             if ( !(p)->sjrv ) {            \
     69                 rule(p,t,&try_result);        \
     70                 (p)->try_ok = 1;          \
     71       }                    \
     72             else {                  \
     73                 (p)->try_ok = 0;          \
     74       }                    \
     75             if ( (p)->try_ok )
     76 
     77 
     78 /* Used only during TRANSFORM mode */
     79 #define  TREE_CONSTR_PTRS  SORASTBase *_r=NULL,*_s=NULL,*_e=NULL
     80 
     81 typedef struct _Sjmp_buf {
     82       jmp_buf state;
     83     } Sjmp_buf;
     84 
     85 class STreeParser {
     86 protected:
     87   int try_ok, sjrv;    /* used by STreeTry macro */
     88   SORASTBase *try_result;  /* tree coming back from try */
     89   int guessing;
     90   Sjmp_buf startofguess;
     91 //  SORASTBase *t;
     92 
     93   void _mkroot(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
     94   void _mkchild(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
     95   virtual void mismatched_range(int looking_for, int upper_token, SORASTBase *found);
     96   virtual void missing_wildcard();
     97   virtual void mismatched_token(int looking_for, SORASTBase *found);
     98   virtual void no_viable_alt(char *rulename, SORASTBase *root);
     99   virtual void MATCH(SORASTBase *_t, int tok);
    100   virtual void MATCHRANGE(SORASTBase *_t, int tok, int tok2);
    101   virtual void WILDCARD(SORASTBase *_t);
    102 
    103 public:
    104   STreeParser() { guessing = 0; }
    105   virtual void panic(char *err);
    106   void save_state(STreeParser *);
    107   void restore_state(STreeParser *);
    108 };
    109 
    110 #endif
    111