bits.c

来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 1,026 行 · 第 1/2 页

C
1,026
字号
{
	if ( GenCC ) return DefErrSetForCC1(nilOK, f, subst, name, "_set");
	else return DefErrSetForC1(nilOK, f, subst, name, "_set");
}

int
#ifdef __USE_PROTOS
DefErrSet( set *f, int subst, char *name )
#else
DefErrSet( f, subst, name )
set *f;
int subst;			/* should be substitute error classes? */
char *name;
#endif
{
    return DefErrSet1(0,f,subst,name);
}

int
#ifdef __USE_PROTOS
DefErrSetWithSuffix(int nilOK, set *f, int subst, char *name, const char* suffix)
#else
DefErrSetWithSuffix(nilOK, f, subst, name, suffix )
int nilOK;
set *f;
int subst;			/* should be substitute error classes? */
char *name;
char *suffix;
#endif
{
	if ( GenCC ) return DefErrSetForCC1(nilOK, f, subst, name, suffix );
	else return DefErrSetForC1(nilOK, f, subst, name, suffix);
}

/* Define a new error set.  WARNING...set-implementation dependent.
 */
int
#ifdef __USE_PROTOS
DefErrSetForC1(int nilOK, set *f, int subst, char * name, const char * suffix)
#else
DefErrSetForC1(nilOK, f, subst, name, suffix)
int nilOK;          /* MR13 */
set *f;
int subst;			/* should be substitute error classes? */
char *name;
const char *suffix;
#endif
{
	unsigned *p, *endp;
	int e=1;

    if (!nilOK)	require(!set_nil(*f), "DefErrSetForC1: nil set to dump?");

	if ( subst ) SubstErrorClass(f);
	p = f->setword;
	endp = &(f->setword[f->n]);
	esetnum++;
	if ( name!=NULL )
		fprintf(DefFile, "extern SetWordType %s%s[];\n", name, suffix);
	else
		fprintf(DefFile, "extern SetWordType zzerr%d[];\n", esetnum);
	if ( name!=NULL ) {
		fprintf(ErrFile, "SetWordType %s%s[%d] = {",
				name,
                suffix,
				NumWords(TokenNum-1)*sizeof(unsigned));
	}
	else {
		fprintf(ErrFile, "SetWordType zzerr%d[%d] = {",
				esetnum,
				NumWords(TokenNum-1)*sizeof(unsigned));
	}
	while ( p < endp )
	{
		if ( e > 1 ) fprintf(ErrFile, ", ");
		DumpIntAsChars(ErrFile, "0x%x", *p++);
		if ( e == 3 )
		{
			DAWDLE;
			if ( p < endp ) fprintf(ErrFile, ",");
			fprintf(ErrFile, "\n\t");
			e=1;
		}
		else e++;
	}
	fprintf(ErrFile, "};\n");

	return esetnum;
}

int
#ifdef __USE_PROTOS
DefErrSetForC( set *f, int subst, char *name )
#else
DefErrSetForC( f, subst, name )
set *f;
int subst;			/* should be substitute error classes? */
char *name;
#endif
{
  return DefErrSetForC1(0,f,subst,name, "_set");
}

/* Define a new error set.  WARNING...set-implementation dependent;
 * Only used when -CC on.
 */

int
#ifdef __USE_PROTOS
DefErrSetForCC1(int nilOK, set *f, int subst, char *name, const char *suffix )
#else
DefErrSetForCC1(nilOK, f, subst, name, suffix )
int nilOK;          /* MR13 */
set *f;
int subst;			/* should be substitute error classes? */
char *name;
const char *suffix;
#endif
{
	unsigned *p, *endp;
	int e=1;

    if (!nilOK)	require(!set_nil(*f), "DefErrSetForCC1: nil set to dump?");

	if ( subst ) SubstErrorClass(f);
	p = f->setword;
	endp = &(f->setword[f->n]);
	esetnum++;

	if ( name!=NULL ) {
		fprintf(Parser_h, "\tstatic SetWordType %s%s[%d];\n", name, suffix,
				NumWords(TokenNum-1)*sizeof(unsigned));
		fprintf(Parser_c, "SetWordType %s::%s%s[%d] = {",
				CurrentClassName,
				name,
				suffix,
				NumWords(TokenNum-1)*sizeof(unsigned));
	}
	else {
		fprintf(Parser_c, "SetWordType %s::err%d[%d] = {",
				CurrentClassName,
				esetnum,
				NumWords(TokenNum-1)*sizeof(unsigned));
		fprintf(Parser_h, "\tstatic SetWordType err%d[%d];\n", esetnum,
				NumWords(TokenNum-1)*sizeof(unsigned));
	}

	while ( p < endp )
	{
		if ( e > 1 ) fprintf(Parser_c, ", ");
		DumpIntAsChars(Parser_c, "0x%x", *p++);
		if ( e == 3 )
		{
			if ( p < endp ) fprintf(Parser_c, ",");
			fprintf(Parser_c, "\n\t");
			e=1;
		}
		else e++;
	}
	fprintf(Parser_c, "};\n");

	return esetnum;
}

int
#ifdef __USE_PROTOS
DefErrSetForCC( set *f, int subst, char *name )
#else
DefErrSetForCC( f, subst, name )
set *f;
int subst;			/* should be substitute error classes? */
char *name;
#endif
{
  return DefErrSetForCC1(0,f,subst,name, "_set");
}

void
#ifdef __USE_PROTOS
GenParser_c_Hdr(void)
#else
GenParser_c_Hdr()
#endif
{
	int i,j;
    TermEntry   *te;
    char * hasAkaName = NULL;									/* MR23 */

	hasAkaName = (char *) malloc(TokenNum+1);					/* MR23 */
	require(hasAkaName!=NULL, "Cannot alloc hasAkaName\n");		/* MR23 */
	for (i = 0; i < TokenNum; i++) hasAkaName[i]='0';			/* MR23 */
	hasAkaName[TokenNum] = 0;                                   /* MR23 */

	fprintf(Parser_c, "/*\n");
	fprintf(Parser_c, " * %s: P a r s e r  S u p p o r t\n", CurrentClassName);
	fprintf(Parser_c, " *\n");
	fprintf(Parser_c, " * Generated from:");
	for (i=0; i<NumFiles; i++) fprintf(Parser_c, " %s", FileStr[i]);
	fprintf(Parser_c, "\n");
	fprintf(Parser_c, " *\n");
	fprintf(Parser_c, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001\n");
	fprintf(Parser_c, " * Parr Research Corporation\n");
	fprintf(Parser_c, " * with Purdue University Electrical Engineering\n");
	fprintf(Parser_c, " * with AHPCRC, University of Minnesota\n");
	fprintf(Parser_c, " * ANTLR Version %s\n", Version);
	fprintf(Parser_c, " */\n\n");
	
  if ( FirstAction != NULL ) dumpAction(FirstAction,Parser_c, 0, -1, 0, 1);    /* MR11 MR15b */

	fprintf(Parser_c, "#define ANTLR_VERSION	%s\n", VersionDef);

	fprintf(Parser_c, "#include \"pcctscfg.h\"\n");
	fprintf(Parser_c, "#include \"pccts_stdio.h\"\n");
	fprintf(Parser_c, "#define ANTLR_SUPPORT_CODE\n");
	if ( UserTokenDefsFile != NULL )
	   fprintf(Parser_c, "#include %s\n", UserTokenDefsFile);
	else
	   fprintf(Parser_c, "#include \"%s\"\n", DefFileName);

	fprintf(Parser_c, "#include \"%s.h\"\n\n", CurrentClassName);

	fprintf(Parser_c, "const ANTLRChar *%s::tokenName(int tok) ",   /* MR1 */
					CurrentClassName);                  	        /* MR1 */
	fprintf(Parser_c, "  { return _token_tbl[tok]; }\n");	        /* MR1 */ /* MR10 */
	/* Dump a Parser::tokens for each automaton */
	fprintf(Parser_c, "\nconst ANTLRChar *%s::_token_tbl[]={\n",
                                                 CurrentClassName); /* MR20 */
	fprintf(Parser_c, "\t/* 00 */\t\"Invalid\"");

	for (i=1; i<TokenNum-1; i++)
	{
		DAWDLE;
		if ( i == EpToken ) continue;
		/* remapped to invalid token? */
		if ( TokenInd!=NULL && TokenInd[i]>=LastTokenCounted )
		{
			fprintf(Parser_c, ",\n\t/* %02d */\t\"invalid\"", i);
			continue;
		}
		if ( TokenString(i) != NULL ) {
           te=(TermEntry *) hash_get(Tname,TokenString(i));                     /* MR11 */
            if (te == NULL || te->akaString == NULL) {                          /* MR11 */
  	   	      fprintf(Parser_c, ",\n\t/* %02d */\t\"%s\"", i, TokenString(i));
            } else {
			  hasAkaName[i] = '1';											    /* MR23 */
  	   	      fprintf(Parser_c, ",\n\t/* %02d */\t\"%s\"", i, te->akaString);   /* MR11 */
            }
        }
		else
		{
			/* look in all lexclasses for the reg expr */
			for (j=0; j<NumLexClasses; j++)
			{
				lexmode(j);
				if ( ExprString(i) != NULL )
				{
					fprintf(Parser_c, ",\n\t/* %02d */\t", i);
					dumpExpr(Parser_c, ExprString(i));
					break;
				}
			}
			if ( j>=NumLexClasses )
			{
				if ( UserDefdTokens )
				{
					fprintf(Parser_c, ",\n\t/* %02d */\t\"\"", i);
				}
				else
					fatal_internal(eMsgd("No label or expr for token %d",i));
			}
		}
	}
	fprintf(Parser_c, "\n};\n");

	/* Build constructors */
	fprintf(Parser_c, "\n%s::", CurrentClassName);
	fprintf(Parser_c,	"%s(ANTLRTokenBuffer *input) : %s(input,%d,%d,%d,%d)\n",
						CurrentClassName,
						(BaseClassName == NULL ? "ANTLRParser" : BaseClassName),
						OutputLL_k,
						FoundGuessBlk,
						DemandLookahead,
						NumWords(TokenNum-1)*sizeof(unsigned));
	fprintf(Parser_c, "{\n");
	fprintf(Parser_c, "\ttoken_tbl = _token_tbl;\n");
    if (TraceGen) {
      fprintf(Parser_c, "\ttraceOptionValueDefault=1;\t\t// MR10 turn trace ON\n");
    } else {
      fprintf(Parser_c, "\ttraceOptionValueDefault=0;\t\t// MR10 turn trace OFF\n");
    };
	fprintf(Parser_c, "}\n\n");
	free ( (void *) hasAkaName);
}

void
#ifdef __USE_PROTOS
GenParser_h_Hdr(void)
#else
GenParser_h_Hdr()
#endif
{
	int i;

	fprintf(Parser_h, "/*\n");
	fprintf(Parser_h, " * %s: P a r s e r  H e a d e r \n", CurrentClassName);
	fprintf(Parser_h, " *\n");
	fprintf(Parser_h, " * Generated from:");
	for (i=0; i<NumFiles; i++) fprintf(Parser_h, " %s", FileStr[i]);
	fprintf(Parser_h, "\n");
	fprintf(Parser_h, " *\n");
	fprintf(Parser_h, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001\n");
	fprintf(Parser_h, " * Parr Research Corporation\n");
	fprintf(Parser_h, " * with Purdue University Electrical Engineering\n");
	fprintf(Parser_h, " * with AHPCRC, University of Minnesota\n");
	fprintf(Parser_h, " * ANTLR Version %s\n", Version);
	fprintf(Parser_h, " */\n\n");

  if ( FirstAction != NULL ) dumpAction( FirstAction, Parser_h, 0, -1, 0, 1);         /* MR11 MR15b */

	fprintf(Parser_h, "#ifndef %s_h\n", CurrentClassName);
	fprintf(Parser_h, "#define %s_h\n\n", CurrentClassName);

    fprintf(Parser_h, "#ifndef ANTLR_VERSION\n");
    fprintf(Parser_h, "#define ANTLR_VERSION %s\n",VersionDef);
    fprintf(Parser_h, "#endif\n\n");

	if ( GenAST ) fprintf(Parser_h, "class ASTBase;\n");
    if (TraceGen) {
      fprintf(Parser_h,"#ifndef zzTRACE_RULES\n");  /* MR20 */
      fprintf(Parser_h,"#define zzTRACE_RULES\n");  /* MR20 */
      fprintf(Parser_h,"#endif\n");                 /* MR22 */
    };
	fprintf(Parser_h, "#include \"%s\"\n\n", APARSER_H);

	if ( HdrAction != NULL ) dumpAction( HdrAction, Parser_h, 0, -1, 0, 1);
	
/* MR10 */    if (ClassDeclStuff == NULL) {
/* MR10 */  	fprintf(Parser_h, "class %s : public ANTLRParser {\n", CurrentClassName);
/* MR10 */    } else {
/* MR10 */      fprintf(Parser_h, "class %s %s {\n",CurrentClassName,ClassDeclStuff);
/* MR10 */    };

	fprintf(Parser_h, "public:\n");					          /* MR1 */
	fprintf(Parser_h, "\tstatic  const ANTLRChar *tokenName(int tk);\n");/* MR1 */
    fprintf(Parser_h, "\tenum { SET_SIZE = %i };\n",TokenNum-1);         /* MR21 */
	fprintf(Parser_h, "protected:\n");
	fprintf(Parser_h, "\tstatic const ANTLRChar *_token_tbl[];\n");     /* MR20 */
	fprintf(Parser_h, "private:\n");
}

/* Currently, this is only used in !GenCC mode */
void
#ifdef __USE_PROTOS
GenErrHdr( void )
#else
GenErrHdr( )
#endif
{
	int i, j;
    TermEntry   *te;

	fprintf(ErrFile, "/*\n");
	fprintf(ErrFile, " * A n t l r  S e t s / E r r o r  F i l e  H e a d e r\n");
	fprintf(ErrFile, " *\n");
	fprintf(ErrFile, " * Generated from:");
	for (i=0; i<NumFiles; i++) fprintf(ErrFile, " %s", FileStr[i]);
	fprintf(ErrFile, "\n");
	fprintf(ErrFile, " *\n");
	fprintf(ErrFile, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001\n");
	fprintf(ErrFile, " * Parr Research Corporation\n");
	fprintf(ErrFile, " * with Purdue University Electrical Engineering\n");
	fprintf(ErrFile, " * With AHPCRC, University of Minnesota\n");
	fprintf(ErrFile, " * ANTLR Version %s\n", Version);
	fprintf(ErrFile, " */\n\n");

  if ( FirstAction != NULL ) dumpAction( FirstAction, ErrFile, 0, -1, 0, 1);         /* MR11 MR15b */
	
  fprintf(ErrFile, "#define ANTLR_VERSION	%s\n", VersionDef);

  fprintf(ErrFile, "#include \"pcctscfg.h\"\n");
	fprintf(ErrFile, "#include \"pccts_stdio.h\"\n");
	if ( strcmp(ParserName, DefaultParserName)!=0 )
		fprintf(ErrFile, "#define %s %s\n", DefaultParserName, ParserName);
	if ( strcmp(ParserName, DefaultParserName)!=0 )
		fprintf(ErrFile, "#include \"%s\"\n", RemapFileName);
	if ( HdrAction != NULL ) dumpAction( HdrAction, ErrFile, 0, -1, 0, 1 );
	if ( FoundGuessBlk )
	{
		fprintf(ErrFile, "#define ZZCAN_GUESS\n");
		fprintf(ErrFile, "#include \"pccts_setjmp.h\"\n");
	}
    if (TraceGen) {
      fprintf(ErrFile,"#ifndef zzTRACE_RULES\n");  /* MR20 */
      fprintf(ErrFile,"#define zzTRACE_RULES\n");  /* MR20 */
      fprintf(ErrFile,"#endif\n");                 /* MR22 */
    };

	if ( OutputLL_k > 1 ) fprintf(ErrFile, "#define LL_K %d\n", OutputLL_k);
#ifdef DUM
	if ( LexGen ) fprintf(ErrFile, "#define zzEOF_TOKEN %d\n", (TokenInd!=NULL?TokenInd[EofToken]:EofToken));
#endif
	fprintf(ErrFile, "#define zzSET_SIZE %d\n", NumWords(TokenNum-1)*sizeof(unsigned));
	if ( DemandLookahead ) fprintf(ErrFile, "#define DEMAND_LOOK\n");
	fprintf(ErrFile, "#include \"antlr.h\"\n");
	if ( GenAST ) fprintf(ErrFile, "#include \"ast.h\"\n");
			
    if ( UserDefdTokens ) fprintf(ErrFile, "#include %s\n", UserTokenDefsFile);
	/* still need this one as it has the func prototypes */
	fprintf(ErrFile, "#include \"%s\"\n", DefFileName);
	fprintf(ErrFile, "#include \"dlgdef.h\"\n");
	fprintf(ErrFile, "#include \"err.h\"\n\n");

	/* Dump a zztokens for each automaton */
	if ( strcmp(ParserName, DefaultParserName)!=0 )
	{
		fprintf(ErrFile, "ANTLRChar *%s_zztokens[%d]={\n", ParserName, TokenNum-1);
	}
	else
	{
		fprintf(ErrFile, "ANTLRChar *zztokens[%d]={\n", TokenNum-1);
	}
	fprintf(ErrFile, "\t/* 00 */\t\"Invalid\"");
	for (i=1; i<TokenNum-1; i++)
	{
		DAWDLE;
		if ( i == EpToken ) continue;
		/* remapped to invalid token? */
		if ( TokenInd!=NULL && TokenInd[i]>=LastTokenCounted )
		{
			fprintf(ErrFile, ",\n\t/* %02d */\t\"invalid\"", i);
			continue;
		}
		if ( TokenString(i) != NULL ) {
            te=(TermEntry *) hash_get(Tname,TokenString(i));                     /* MR11 */
            if (te == NULL || te->akaString == NULL) {                          /* MR11 */
  			  fprintf(ErrFile, ",\n\t/* %02d */\t\"%s\"", i, TokenString(i));
            } else {
  			  fprintf(ErrFile, ",\n\t/* %02d */\t\"%s\"", i, te->akaString);    /* MR11 */
            }
        }
		else
		{
			/* look in all lexclasses for the reg expr */
			for (j=0; j<NumLexClasses; j++)
			{
				lexmode(j);
				if ( ExprString(i) != NULL )
				{
					fprintf(ErrFile, ",\n\t/* %02d */\t", i);
					dumpExpr(ErrFile, ExprString(i));
					break;
				}
			}
			if ( j>=NumLexClasses )
			{
				if ( UserDefdTokens )
				{
					fprintf(ErrFile, ",\n\t/* %02d */\t\"\"", i);
				}
				else
					fatal_internal(eMsgd("No label or expr for token %d",i));
			}
		}
	}
	fprintf(ErrFile, "\n};\n");
}

void
#ifdef __USE_PROTOS
dumpExpr( FILE *f, char *e )
#else
dumpExpr( f, e )
FILE *f;
char *e;
#endif
{
	while ( *e!='\0' )
	{
		if ( *e=='\\' && *(e+1)=='\\' )
			{putc('\\', f); putc('\\', f); e+=2;}
		else if ( *e=='\\' && *(e+1)=='"' )
			{putc('\\', f); putc('"', f); e+=2;}
		else if ( *e=='\\' ) {putc('\\', f); putc('\\', f); e++;}
		else {putc(*e, f); e++;}
	}
}

int
#ifdef __USE_PROTOS
isTermEntryTokClass(TermEntry *te)
#else
isTermEntryTokClass(te)
TermEntry *te;
#endif
{
	ListNode *t;
	TCnode *p;
	TermEntry *q;
	char *tokstr;

	if (tclasses == NULL) return 0;

	for (t = tclasses->next; t!=NULL; t=t->next)
	{
		p = (TCnode *) t->elem;
		tokstr = TokenString(p->tok);
		lexmode(p->lexclass);	/* switch to lexclass where tokclass is defined */
        q = (TermEntry *) hash_get(Tname, tokstr);
		if (q == te) return 1;
	}
	return 0;
}

⌨️ 快捷键说明

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