<<
/* parser.dlg -- DLG Description of scanner
 *
 * Generated from: dlg_p.g
 *
 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
 * Purdue University Electrical Engineering
 * With AHPCRC, University of Minnesota
 * ANTLR Version 1.33MR33
 */

#define ANTLR_VERSION	13333
#include "pcctscfg.h"
#include "pccts_stdio.h"

#include <ctype.h>
#include "dlg.h"
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
LOOKAHEAD

void
#ifdef __USE_PROTOS
zzerraction(void)
#else
zzerraction()
#endif
{
	(*zzerr)("invalid token");
	zzadvance();
	zzskip();
}
>>

<<%%lexaction

int	func_action;		/* should actions be turned into functions?*/
int	lex_mode_counter = 0;	/* keeps track of the number of %%names */
/* MR1									    */
/* MR1  11-Apr-97	Provide mechanism for inserting code into DLG class */
/* MR1				via <<%%lexmember...>>			    */
/* MR1									    */
int	lexMember = 0;		/* <<%%lexmemeber ...>>	   		MR1 */
int	lexAction = 0;		/* <<%%lexaction ...>>			MR1 */
int	parserClass = 0;	/* <<%%parserclass ...>>        MR1 */
int	lexPrefix = 0;		/* <<%%lexprefix ...>>			MR1 */
char	theClassName[100];						     /* MR11 */
char	*pClassName=theClassName;					 /* MR11 */
int	firstLexMember=1;					             /* MR1 */

#ifdef __USE_PROTOS
void  xxputc(int c) {						/* MR1 */
#else
  void xxputc(c)							/* MR1 */
  int	c;							/* MR1 */
  {								/* MR1 */
#endif
    if (parserClass) {						/* MR1 */
      *pClassName++=c;						/* MR1 */
      *pClassName=0;						/* MR1 */
    } else if (lexMember || lexPrefix) {				/* MR1 */
      if (class_stream != NULL) fputc(c,class_stream);		/* MR1 */
    } else {							/* MR1 */
      fputc(c,OUT);						/* MR1 */
    };								/* MR1 */
  }  								/* MR1 */
  
#ifdef __USE_PROTOS
  void xxprintf(char *format,char *string) {			/* MR1 */
#else
    void xxprintf(format,string) 					/* MR1 */
    char *format;							/* MR1 */
    char *string;							/* MR1 */
    {								/* MR1 */
#endif
      if (lexMember || lexPrefix || parserClass) {			/* MR1 */
        if (class_stream != NULL)					/* MR1 */
        fprintf(class_stream,format,string);			/* MR1 */
      } else {							/* MR1 */
        fprintf(OUT,format,string);					/* MR1 */
      };								/* MR1 */
    }  								/* MR1 */
>>


%%START

@
	<<
		NLA = 1;
	>>

[\r\t\ ]+
	<<
		NLA = 2;
    zzskip();   
	>>

\n
	<<
		NLA = 3;
    zzline++; zzskip(); DAWDLE;   
	>>

\@
	<<
		NLA = L_EOF;
	>>

\%\%
	<<
		NLA = PER_PER;
	>>

\%\%[a-zA-Z_][a-zA-Z0-9_]*
	<<
		NLA = NAME_PER_PER;
    p_mode_def(&zzlextext[2],lex_mode_counter++);   
	>>

\<\<\%\%lexmember
	<<
		NLA = LEXMEMBER;
    lexMember=1;					/* MR1 */
    if (firstLexMember != 0) {			/* MR1 */
      firstLexMember=0;				/* MR1 */
      p_class_def1();				/* MR1 */
    };						/* MR1 */
    zzmode(ACT);					/* MR1 */
	>>

\<\<\%\%lexaction
	<<
		NLA = LEXACTION;
    lexAction=1;zzmode(ACT);  
	>>

\<\<\%\%parserclass
	<<
		NLA = PARSERCLASS;
    parserClass=1;				/* MR1 */
    zzmode(ACT);					/* MR1 */
	>>

\<\<\%\%lexprefix
	<<
		NLA = LEXPREFIX;
    lexPrefix=1;zzmode(ACT);  
	>>

\<\<
	<<
		NLA = ACTION;
    if (func_action)
    fprintf(OUT,"\n%s %sact%d()\n{ ",
    gen_cpp?"ANTLRTokenType":"static void",
    gen_cpp?ClassName("::"):"", ++action_no);
    zzmode(ACT); zzskip();
	>>

\>\>
	<<
		NLA = GREAT_GREAT;
	>>

\{
	<<
		NLA = L_BRACE;
	>>

\}
	<<
		NLA = R_BRACE;
	>>

\(
	<<
		NLA = L_PAR;
	>>

\)
	<<
		NLA = R_PAR;
	>>

\[
	<<
		NLA = L_BRACK;
	>>

\]
	<<
		NLA = R_BRACK;
	>>

\*
	<<
		NLA = ZERO_MORE;
	>>

\+
	<<
		NLA = ONE_MORE;
	>>

\|
	<<
		NLA = OR;
	>>

\-
	<<
		NLA = RANGE;
	>>

\~
	<<
		NLA = NOT;
	>>

\\0[0-7]*
	<<
		NLA = OCTAL_VALUE;
    {int t; sscanf(&zzlextext[1],"%o",&t); zzlextext[0] = t;}  
	>>

\\0[Xx][0-9a-fA-F]+
	<<
		NLA = HEX_VALUE;
    {int t; sscanf(&zzlextext[3],"%x",&t); zzlextext[0] = t;}  
	>>

\\[1-9][0-9]*
	<<
		NLA = DEC_VALUE;
    {int t; sscanf(&zzlextext[1],"%d",&t); zzlextext[0] = t;}  
	>>

\\t
	<<
		NLA = TAB;
    zzlextext[0] = '\t';  
	>>

\\n
	<<
		NLA = NL;
    zzlextext[0] = '\n';  
	>>

\\r
	<<
		NLA = CR;
    zzlextext[0] = '\r';  
	>>

\\b
	<<
		NLA = BS;
    zzlextext[0] = '\b';  
	>>

\\ \n
	<<
		NLA = CONTINUATION;
    zzline++; zzskip();  
	>>

\\~[tnrb]
	<<
		NLA = LIT;
    zzlextext[0] = zzlextext[1];  
	>>

~[\\]
	<<
		NLA = REGCHAR;
	>>


%%ACT

@
	<<
		NLA = 1;
    error("unterminated action", zzline); zzmode(START);   
	>>

\>\>
	<<
		NLA = ACTION;
    if (func_action) fprintf(OUT,"}\n\n");
    zzmode(START);
    /* MR1									    */
    /* MR1  11-Apr-97	Provide mechanism for inserting code into DLG class */
    /* MR1				via <<%%lexmember ...>>			    */
    /* MR1			This is a consequence of not saving actions         */
    /* MR1									    */
    /* MR1 */	   parserClass=0;		
    /* MR1 */	   lexPrefix=0;
    /* MR1 */	   lexAction=0;
    /* MR1 */	   lexMember=0;
	>>

\>
	<<
		NLA = 34;
    xxputc(zzlextext[0]); zzskip();   
	>>

\\\>
	<<
		NLA = 35;
    xxputc('>'); zzskip();   
	>>

\\
	<<
		NLA = 36;
    xxputc('\\'); zzskip();   
	>>

\n
	<<
		NLA = 37;
    xxputc(zzlextext[0]); ++zzline; zzskip();   
	>>

/\*
	<<
		NLA = 38;
    zzmode(ACTION_COMMENTS);			/* MR1 */
    xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */
	>>

//
	<<
		NLA = 39;
    zzmode(ACTION_CPP_COMMENTS);			/* MR1 */
    xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */
	>>

~[]
	<<
		NLA = 40;
    xxputc(zzlextext[0]); zzskip();   
	>>


%%ACTION_COMMENTS

@
	<<
		NLA = 1;
	>>

\*/
	<<
		NLA = 41;
    zzmode(ACT);					/* MR1 */
    xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */
	>>

[\n\r]
	<<
		NLA = 42;
    zzline++; xxputc(zzlextext[0]); zzskip();  
	>>

~[]
	<<
		NLA = 43;
    xxputc(zzlextext[0]); zzskip();  
	>>


%%ACTION_CPP_COMMENTS

@
	<<
		NLA = 1;
	>>

[\n\r]
	<<
		NLA = 44;
    zzmode(ACT); zzline++;			/* MR1 */
    xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */
	>>

~[]
	<<
		NLA = 45;
    xxputc(zzlextext[0]); zzskip();  
	>>

%%
