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 + -
显示快捷键?