Logo Search packages:      
Sourcecode: pccts version File versions  Download package


#ifndef STreeParser_h
#define STreeParser_h

 * STreeParser.h
 * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public
 * domain.  An individual or company may do whatever they wish with
 * source code distributed with SORCERER or the code generated by
 * SORCERER, including the incorporation of SORCERER, or its output, into
 * commerical software.
 * We encourage users to develop software with SORCERER.  However, we do
 * ask that credit is given to us for developing SORCERER.  By "credit",
 * we mean that if you incorporate our source code into one of your
 * programs (commercial product, research project, or otherwise) that you
 * acknowledge this fact somewhere in the documentation, research report,
 * etc...  If you like SORCERER and have developed a nice tool with the
 * output, please mention that you developed it using SORCERER.  In
 * addition, we ask that this header remain intact in our source code.
 * As long as these guidelines are kept, we expect to continue enhancing
 * this system and expect to make other tools available as they are
 * completed.
 * Parr Research Corporation
 * with Purdue University and AHPCRC, University of Minnesota
 * 1992-1994

/* The programmer should derive a class from SORASTBase; SORASTBase defines
 * the minimum public interface that a tree node must follow for SORCERER to
 * be able to walk the trees.

/* The @-vars are added by the subclass created by SORCERER; the constructor
 * is used to init the @-vars.

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
#include "SASTBase.h"

#define _DOWN                       _t=(SORASTBase *)_t->down()
#define _RIGHT                      _t=(SORASTBase *)_t->right()

#define _SAVE                       SORASTBase *_save=_t
#define _RESTORE              _t = _save
#define _GUESS_BLOCK          STreeParser _st; int _gv; SORASTBase *_savet=NULL;
#define _GUESS                      {save_state(&_st); \
                                          _savet = _t; \
                                          guessing = 1; \
                                          _gv = setjmp(startofguess.state);}
#define _GUESS_FAIL                 longjmp(startofguess.state, 1)
#define _GUESS_DONE                 {restore_state(&_st); _t = _savet;}
#define _MATCH(tok)                 MATCH(_t,tok)
#define _MATCHRANGE(t1,t2)    MATCHRANGE(_t,t1,t2)
#define _WILDCARD             WILDCARD(_t)

#define ast_return(t)         *_result = (SORASTBase *)t;

#define STreeTry(r,p,t)     \
                  (p)->try_result = NULL;                         \
            (p)->sjrv = setjmp((p)->startofguess);  \
            if ( !(p)->sjrv ) {                                   \
                rule(p,t,&try_result);                      \
                (p)->try_ok = 1;                            \
                  }                                                           \
            else {                                                      \
                (p)->try_ok = 0;                            \
                  }                                                           \
            if ( (p)->try_ok )

/* Used only during TRANSFORM mode */
#define     TREE_CONSTR_PTRS  SORASTBase *_r=NULL,*_s=NULL,*_e=NULL

typedef struct _Sjmp_buf {
                  jmp_buf state;
            } Sjmp_buf;

class STreeParser {
      int try_ok, sjrv;       /* used by STreeTry macro */
      SORASTBase *try_result; /* tree coming back from try */
      int guessing;
      Sjmp_buf startofguess;
//    SORASTBase *t;

      void _mkroot(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
      void _mkchild(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
      virtual void mismatched_range(int looking_for, int upper_token, SORASTBase *found);
      virtual void missing_wildcard();
      virtual void mismatched_token(int looking_for, SORASTBase *found);
      virtual void no_viable_alt(char *rulename, SORASTBase *root);
      virtual void MATCH(SORASTBase *_t, int tok);
      virtual void MATCHRANGE(SORASTBase *_t, int tok, int tok2);
      virtual void WILDCARD(SORASTBase *_t);

      STreeParser() { guessing = 0; }
      virtual void panic(char *err);
      void save_state(STreeParser *);
      void restore_state(STreeParser *);

      virtual int printMessage(FILE* pFile, const char* pFormat, ...); // MR23


Generated by  Doxygen 1.6.0   Back to index