⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 antlr.g

📁 SRI international 发布的OAA框架软件
💻 G
📖 第 1 页 / 共 5 页
字号:
/*
 * antlr.g	--	PCCTS Version 1.xx ANTLR
 *
 * Parse an antlr input grammar and build a syntax-diagram.
 *
 * Written in itself (needs at least 1.06 to work)
 *
 * SOFTWARE RIGHTS
 *
 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 * company may do whatever they wish with source code distributed with
 * PCCTS or the code generated by PCCTS, including the incorporation of
 * PCCTS, or its output, into commerical software.
 *
 * We encourage users to develop software with PCCTS.  However, we do ask
 * that credit is given to us for developing PCCTS.  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 PCCTS and have developed a nice tool with the
 * output, please mention that you developed it using PCCTS.  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.
 *
 * ANTLR 1.33
 * Terence Parr
 * Parr Research Corporation
 * with Purdue University and AHPCRC, University of Minnesota
 * 1989-1995
 */

/* MR1									*/
/* MR1 10-Apr-97 MR1	Replace #if logic with #include "pcctscfg.h"	*/
/* MR1									*/

#header <<
	#include "pcctscfg.h"
	#include "set.h"
	#include <ctype.h>
	#include "syn.h"
	#include "hash.h"
	#include "generic.h"
	#define zzcr_attr(attr,tok,t)
	>>

<<

/* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */
#if defined(__TURBOC__)
#pragma warn -aus  /* unused assignment of 'xxx' */
#endif


#ifdef __USE_PROTOS
static void chkToken(char *, char *, char *, int);
#else
static void chkToken();
#endif

#ifdef __USE_PROTOS
static int isDLGmaxToken(char *Token);				     /* MR3 */
#else
static int isDLGmaxToken();				                             /* MR3 */
#endif

static int class_nest_level = 0;

/* MR20 G. Hobbelt extern definitions moved to antlr.h */

>>

#lexaction <<
/* maintained, but not used for now */
set AST_nodes_refd_in_actions = set_init;
int inAlt = 0;
set attribsRefdFromAction = set_init; /* MR20 */
int UsedOldStyleAttrib = 0;
int UsedNewStyleLabel = 0;
#ifdef __USE_PROTOS
char *inline_set(char *);
#else
char *inline_set();
#endif

/* MR1	10-Apr-97  MR1  Previously unable to put right shift operator	    */
/* MR1					in DLG action			                    */

int tokenActionActive=0;                                            /* MR1 */

>>

#lexclass STRINGS
#token QuotedTerm "\""		<< zzmode(START); >>
#token "\n|\r|\r\n"     	<<
							zzline++;
							warn("eoln found in string");
							zzskip();
							>>
#token "\\(\n|\r|\r\n)"		<< zzline++; zzmore(); >>
#token "\\~[]"				<< zzmore(); >>
#token "~[\n\r\"\\]+"		<< zzmore(); >>

#lexclass ACTION_STRINGS
#token "\""					<< zzmode(ACTIONS); zzmore(); >>
#token "\n|\r|\r\n"			<<
							zzline++;
							warn("eoln found in string (in user action)");
							zzskip();
							>>
#token "\\(\n|\r|\r\n)"		<< zzline++; zzmore(); >>
#token "\\~[]"				<< zzmore(); >>
#token "~[\n\r\"\\]+"			<< zzmore(); >>

#lexclass ACTION_CHARS
#token "'"					<< zzmode(ACTIONS); zzmore(); >>
#token "\n|\r|\r\n"			<<
							zzline++;
							warn("eoln found in char literal (in user action)");
							zzskip();
							>>
#token "\\~[]"				<< zzmore(); >>
#token "~[\n\r'\\]+"		<< zzmore(); >>

#lexclass ACTION_COMMENTS
#token "\*/"				<< zzmode(ACTIONS); zzmore(); >>
#token "\*"					<< zzmore(); >>
#token "\n|\r|\r\n"			<< zzline++; zzmore(); DAWDLE; >>
#token "~[\n\r\*]+"			<< zzmore(); >>

#lexclass TOK_DEF_COMMENTS
#token "\*/"				<< zzmode(PARSE_ENUM_FILE);
                              zzmore(); >>
#token "\*"					<< zzmore(); >>
#token "\n|\r|\r\n"			<< zzline++; zzmore(); DAWDLE; >>
#token "~[\n\r\*]+"			<< zzmore(); >>

#lexclass TOK_DEF_CPP_COMMENTS
#token "\n|\r|\r\n"			<< zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE; >>
#token "~[\n\r]+"			<< zzskip(); >>

#lexclass ACTION_CPP_COMMENTS
#token "\n|\r|\r\n"			<< zzline++; zzmode(ACTIONS); zzmore(); DAWDLE; >>
#token "~[\n\r]+"			<< zzmore(); >>

#lexclass CPP_COMMENTS
#token "\n|\r|\r\n"			<< zzline++; zzmode(START); zzskip(); DAWDLE; >>
#token "~[\n\r]+"			<< zzskip(); >>

#lexclass COMMENTS
#token "\*/"				<< zzmode(START); zzskip(); >>
#token "\*"					<< zzskip(); >>
#token "\n|\r|\r\n"			<< zzline++; zzskip(); DAWDLE; >>
#token "~[\n\r\*]+"			<< zzskip(); >>

/*
 * This lexical class accepts actions of type [..] and <<..>>
 *
 * It translates the following special items for C:
 *
 * $j		--> "zzaArg(current zztasp, j)"
 * $i.j		--> "zzaArg(zztaspi, j)"
 * $i.nondigit> "zzaArg(current zztasp, i).nondigit"
 * $$		--> "zzaRet"
 * $alnum	--> "alnum"			(used to ref parameters)
 * $rule	--> "zzaRet"
 * $retval	--> "_retv.retval" if > 1 return values else "_retv"
 * $[token, text] --> "zzconstr_attr(token, text)"
 * $[]		--> "zzempty_attr()"
 *
 * It translates the following special items for C++:
 * (attributes are now stored with 'Token' and $i's are only
 *  pointers to the Tokens.  Rules don't have attributes now.)
 *
 * $j		--> "_tbj" where b is the block level
 * $i.j		--> "_tij"
 * $j->nondigit> "_tbj->nondigit"
 * $$		--> "$$"
 * $alnum	--> "alnum"			(used to ref parameters)
 * $rule	--> "$rule"
 * $retval	--> "_retv.retval" if > 1 return values else "_retv"
 * $[token, text] --> invalid
 * $[]		--> invalid
 *
 * And, for trees:
 *
 * #0		-->	"(*_root)"
 * #i		--> "zzastArg(i)"
 * #[args]	--> "zzmk_ast(zzastnew(), args)"
 * #[]		--> "zzastnew()"
 * #( root, child1, ..., childn )
 *			--> "zztmake(root, child1, ...., childn, NULL)"
 * #()		--> "NULL"
 *
 * For C++, ...
 *
 * #0		-->	"(*_root)"
 * #i		--> "_astbi" where b is the block level
 * #alnum	--> "alnum_ast"	(used to ref #label)
 * #[args]	--> "new AST(args)"
 * #[]		--> "new AST"
 * #( root, child1, ..., childn )
 *			--> "AST::tmake(root, child1, ...., childn, NULL)"
 * #()		--> "NULL"
 *
 * To escape,
 *
 * \]		--> ]
 * \)		--> )
 * \$		--> $
 * \#		--> #
 *
 * A stack is used to nest action terminators because they can be nested
 * like crazy:  << #[$[..],..] >>
 */
#lexclass ACTIONS
#token Action "\>\>"        << /* these do not nest */
                              zzmode(START);
                              NLATEXT[0] = ' ';
                              NLATEXT[1] = ' ';
                              zzbegexpr[0] = ' ';
                              zzbegexpr[1] = ' ';
							  if ( zzbufovf ) {
								err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE));
							  }

/* MR1	10-Apr-97  MR1  Previously unable to put right shift operator	*/
/* MR1					in DLG action			*/
/* MR1			Doesn't matter what kind of action it is - reset*/

			      tokenActionActive=0;		 /* MR1 */
                            >>
#token Pred "\>\>?"			<< /* these do not nest */
                              zzmode(START);
                              NLATEXT[0] = ' ';
                              NLATEXT[1] = ' ';
                              zzbegexpr[0] = '\0';
							  if ( zzbufovf ) {
								err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE));
							  };
#ifdef __cplusplus__
/* MR10 */                    list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
#else
#ifdef __STDC__
/* MR10 */                    list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
#else
#ifdef __USE_PROTOS
/* MRxx */                    list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
#else
/* MR10 */                    list_apply(CurActionLabels,mark_label_used_in_sem_pred);
#endif
#endif
#endif
                            >>
#token PassAction "\]"		<< if ( topint() == ']' ) {
								  popint();
								  if ( istackempty() )	/* terminate action */
								  {
									  zzmode(START);
									  NLATEXT[0] = ' ';
									  zzbegexpr[0] = ' ';
									  if ( zzbufovf ) {
										err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE));
									  }
								  }
								  else {
									  /* terminate $[..] and #[..] */
									  if ( GenCC ) zzreplstr("))");
									  else zzreplstr(")");
									  zzmore();
								  }
							   }
							   else if ( topint() == '|' ) { /* end of simple [...] */
								  popint();
								  zzmore();
							   }
							   else zzmore();
							>>
#token "consumeUntil\( [\ \t]* \{~[\}]+\} [\ \t]* \)"
   							<<
   							zzmore();
							zzreplstr(inline_set(zzbegexpr+
									  strlen("consumeUntil(")));
							>>
#token "consumeUntil\( ~[\)]+ \)"
							<< zzmore(); >>
#token "\n|\r|\r\n"			<< zzline++; zzmore(); DAWDLE; >>
#token "\>"					<< zzmore(); >>
#token "$"					<< zzmore(); >>
#token "$$"					<< if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();}
							   else err("$$ use invalid in C++ mode"); >>

#token "$\[\]"				<< if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();}
							   else err("$[] use invalid in C++ mode"); >>
#token "$\["				<<
							pushint(']');
							if ( !GenCC ) zzreplstr("zzconstr_attr(");
							else err("$[..] use invalid in C++ mode");
							zzmore();
							>>
#token "$[0-9]+"			<<{
							static char buf[100];
                            numericActionLabel=1;       /* MR10 */
							if ( strlen(zzbegexpr)>(size_t)85 )
								fatal("$i attrib ref too big");
							set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
							if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)",
										BlkLevel-1,zzbegexpr+1);
							else sprintf(buf,"_t%d%s",
										BlkLevel-1,zzbegexpr+1);
							zzreplstr(buf);
							zzmore();
							UsedOldStyleAttrib = 1;
							if ( UsedNewStyleLabel )
								err("cannot mix old-style $i with new-style labels");
							}
							>>
#token "$[0-9]+."			<<{
							static char buf[100];
                            numericActionLabel=1;       /* MR10 */
							if ( strlen(zzbegexpr)>(size_t)85 )
								fatal("$i.field attrib ref too big");
							zzbegexpr[strlen(zzbegexpr)-1] = ' ';
							set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
							if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).",
										BlkLevel-1,zzbegexpr+1);
							else sprintf(buf,"_t%d%s.",
										BlkLevel-1,zzbegexpr+1);
							zzreplstr(buf);
							zzmore();
							UsedOldStyleAttrib = 1;
							if ( UsedNewStyleLabel )
								err("cannot mix old-style $i with new-style labels");
							}
							>>
#token "$[0-9]+.[0-9]+"		<<{
							static char buf[100];
							static char i[20], j[20];
							char *p,*q;
                            numericActionLabel=1;       /* MR10 */
							if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big");
							for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) {
								if ( q == &i[20] )
									 fatalFL("i of $i.j attrib ref too big",
											 FileStr[CurFile], zzline );
								*q++ = *p;
							}
							*q = '\0';
							for (p++, q= &j[0]; *p!='\0'; p++) {
								if ( q == &j[20] )
									fatalFL("j of $i.j attrib ref too big",
											FileStr[CurFile], zzline );
								*q++ = *p;
							}
							*q = '\0';
							if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j);
							else sprintf(buf,"_t%s%s",i,j);
							zzreplstr(buf);
							zzmore();
							UsedOldStyleAttrib = 1;
							if ( UsedNewStyleLabel )
								err("cannot mix old-style $i with new-style labels");
							}
							>>
#token "$[_a-zA-Z][_a-zA-Z0-9]*"
							<<{ static char buf[300]; LabelEntry *el;
							zzbegexpr[0] = ' ';
							if ( CurRule != NULL &&
								 strcmp(CurRule, &zzbegexpr[1])==0 ) {
								if ( !GenCC ) zzreplstr("zzaRet");
							}
							else if ( CurRetDef != NULL &&
									  strmember(CurRetDef, &zzbegexpr[1])) {
								 if ( hasMultipleOperands( CurRetDef ) ) {
									require (strlen(zzbegexpr)<=(size_t)285,
											 "$retval attrib ref too big");
									sprintf(buf,"_retv.%s",&zzbegexpr[1]);
									zzreplstr(buf);
								}
								else zzreplstr("_retv");
							}
							else if ( CurParmDef != NULL &&
									  strmember(CurParmDef, &zzbegexpr[1])) {
								;
							}
							else if ( Elabel==NULL ) {
								{ err("$-variables in actions outside of rules are not allowed"); }
							} else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) {
/* MR10 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -