genmms.c
来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 751 行 · 第 1/2 页
C
751 行
else printf(", %s$(SCAN).c", DIR());
}
if ( !gen_CPP ) printf(" $(ERR).c");
printf("\n");
printf("OBJ = ");
pfiles(files, n, "obj");
if ( gen_CPP ) {
printf(" ,-\n ");
printf(" ");
pclasses(classes, num_classes, "o");
printf(" ,-\n ");
printf(" %s%s", DIR(), APARSER_O);
if ( !user_lexer ) {
printf(", %s%s", DIR(), DLEXERBASE_O);
}
if ( gen_trees ) {
printf(" ,-\n ");
printf("%s%s", DIR(), ASTBASE_O);
printf(", %s%s", DIR(), PCCTSAST_O);
/* printf(" %s%s", DIR(), LIST_O); */
}
printf(", %s%s", DIR(), ATOKENBUFFER_O);
}
if ( !user_lexer ) {
if ( gen_CPP ) printf(", $(SCAN)%s", OBJ_FILE_SUFFIX);
else printf(", %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);
}
if ( !gen_CPP ) printf(", $(ERR)%s", OBJ_FILE_SUFFIX);
printf("\n");
printf("ANTLR_SPAWN = ");
if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
else pfiles(files, n, "c");
if ( gen_CPP ) {
printf(", ");
pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
printf(" ,-\n ");
pclasses(classes, num_classes, "h");
if ( strcmp(hdr,"stdpccts.h")!=0 ) {
printf(" ,-\n ");
printf("$(HDR_FILE), stdpccts.h");
}
}
if ( user_lexer ) {
if ( !user_token_types ) printf(", $(TOKENS)");
}
else {
printf(", $(DLG_FILE)");
if ( !user_token_types ) printf(", $(TOKENS)");
}
if ( !gen_CPP ) printf(", $(ERR).c");
printf("\n");
if ( !user_lexer ) {
if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);
else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
if ( gen_CPP ) printf(", $(SCAN).h");
else printf(", $(MOD_FILE)");
printf("\n");
}
printf("ANTLR_SPAWN_ALL_VERSIONS = ");
if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
else pfiles(files, n, "c");
if ( gen_CPP ) {
printf(";*, ");
pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
printf(";* ,-\n ");
pclasses(classes, num_classes, "h");
printf(";*");
if ( strcmp(hdr,"stdpccts.h")!=0 ) {
printf(" ,-\n ");
printf("$(HDR_FILE);*, stdpccts.h;*");
}
}
if ( user_lexer ) {
if ( !user_token_types ) printf(", $(TOKENS);*");
}
else {
printf(", $(DLG_FILE);*");
if ( !user_token_types ) printf(", $(TOKENS);*");
}
if ( !gen_CPP ) printf(", $(ERR).c;*");
printf("\n");
if ( !user_lexer ) {
if ( gen_CPP ) printf("DLG_SPAWN_ALL_VERSIONS = $(SCAN)%s;*", CPP_FILE_SUFFIX);
else printf("DLG_SPAWN_ALL_VERSIONS = %s$(SCAN).c;*", DIR());
if ( gen_CPP ) printf(", $(SCAN).h;*");
else printf(", $(MOD_FILE);*");
printf("\n");
}
if ( gen_CPP ) {
printf("CCC=CXX\n");
printf("CC=$(CCC)\n");
}
else printf("CC=cc\n");
/* set up dependencies */
printf("\n%s.exe : $(OBJ), $(SRC)\n", project);
if (gen_CPP)
printf(" CXXLINK %s %s $(LNKFLAGS) $(OBJ)\n",
RENAME_EXE_FLAG,
project);
else
printf(" LINK %s %s $(LNKFLAGS) $(OBJ)\n",
RENAME_EXE_FLAG,
project);
printf("\n");
/* how to compile parser files */
for (i=0; i<num_files; i++)
{
pfiles(&files[i], 1, "obj");
if ( user_lexer ) {
printf(" : $(TOKENS)");
}
else {
if ( gen_CPP ) printf(" : $(TOKENS), $(SCAN).h");
else printf(" : $(MOD_FILE), $(TOKENS)");
}
printf(", ");
if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
else pfiles(&files[i], 1, "c");
if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
printf("\n");
printf(" %s $(CFLAGS) %s ",gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
pfiles(&files[i], 1, "obj");
printf(" ");
if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
else pfiles(&files[i], 1, "c");
printf("\n\n");
}
/* how to compile err.c */
if ( !gen_CPP ) {
printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);
if ( !user_lexer ) printf(", $(TOKENS)");
printf("\n");
printf(" %s $(CFLAGS) %s $(ERR)%s $(ERR).c",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG,
OBJ_FILE_SUFFIX);
printf("\n\n");
}
/* how to compile Class.c */
for (i=0; i<num_classes; i++)
{
pclasses(&classes[i], 1, "obj");
if ( user_lexer ) {
printf(" : $(TOKENS)");
}
else {
printf(" : $(TOKENS), $(SCAN).h");
}
printf(", ");
pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
printf(", ");
pclasses(&classes[i], 1, "h");
if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
printf("\n");
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
pclasses(&classes[i], 1, "obj");
printf(" ");
pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
printf("\n\n");
}
/* how to compile scan.c */
if ( !user_lexer ) {
if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);
else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());
if ( !user_lexer ) printf(", $(TOKENS)");
printf("\n");
if ( gen_CPP ) printf(" $(CCC) $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",
RENAME_OBJ_FLAG,
OBJ_FILE_SUFFIX,
CPP_FILE_SUFFIX);
else printf(" $(CC) $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
RENAME_OBJ_FLAG,
DIR(),
OBJ_FILE_SUFFIX,
DIR());
printf("\n\n");
}
printf("$(ANTLR_SPAWN) : $(GRM)\n");
printf(" $(ANTLR) $(AFLAGS) $(GRM)\n");
if ( !user_lexer )
{
printf("\n");
printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
if ( gen_CPP ) printf(" $(DLG) $(DFLAGS) $(DLG_FILE)\n");
else printf(" $(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
}
/* do the makes for ANTLR/DLG support */
if ( gen_CPP ) {
printf("\n");
printf("%s%s : $(ANTLR_H)%s\n", DIR(), APARSER_O, APARSER_C);
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s\n", DIR(), APARSER_O, APARSER_C);
printf("\n");
printf("%s%s : $(ANTLR_H)%s\n", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s\n", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
if ( !user_lexer ) {
printf("\n");
printf("%s%s : $(ANTLR_H)%s\n", DIR(), DLEXERBASE_O, DLEXERBASE_C);
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s\n", DIR(), DLEXERBASE_O, DLEXERBASE_C);
}
if ( gen_trees ) {
printf("\n");
printf("%s%s : $(ANTLR_H)%s\n", DIR(), ASTBASE_O, ASTBASE_C);
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s\n", DIR(), ASTBASE_O, ASTBASE_C);
printf("\n");
printf("%s%s : $(ANTLR_H)%s\n", DIR(), PCCTSAST_O, PCCTSAST_C);
printf(" %s $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",
RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s\n", DIR(), PCCTSAST_O, PCCTSAST_C);
printf("\n");
/*
printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
printf(" %s -c $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
*/
}
}
/* clean and scrub targets */
printf("\nclean :\n");
printf(" delete *%s.*, %s.exe.*", OBJ_FILE_SUFFIX, project);
if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s;*", DIR(), OBJ_FILE_SUFFIX);
printf("\n");
printf("\nscrub :\n");
printf(" delete *%s.*, %s.exe;*", OBJ_FILE_SUFFIX, project);
if ( strcmp(outdir, ".")!=0 ) printf(", %s*%s.*", DIR(), OBJ_FILE_SUFFIX);
printf(", $(ANTLR_SPAWN_ALL_VERSIONS)");
if ( !user_lexer ) printf(", $(DLG_SPAWN_ALL_VERSIONS)");
printf("\n");
}
void pfiles(files, n, suffix)
char **files;
int n;
char *suffix;
{
int first=1;
while ( n>0 )
{
char *p = &(*files)[strlen(*files)-1];
if ( !first ) putchar(' ');
first=0;
while ( p > *files && *p != '.' ) --p;
if ( p == *files )
{
fprintf(stderr,
"genmk: filenames must be file.suffix format: %s\n",
*files);
exit(-1);
}
if ( suffix == NULL ) printf("%s", *files);
else
{
*p = '\0';
printf("%s", DIR());
if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);
else printf("%s.%s", *files, suffix);
*p = '.';
}
files++;
--n;
}
}
void pclasses(classes, n, suffix)
char **classes;
int n;
char *suffix;
{
int first=1;
while ( n>0 )
{
if ( !first ) putchar(' ');
first=0;
if ( suffix == NULL ) printf("%s", *classes);
else {
printf("%s", DIR());
if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);
else printf("%s.%s", *classes, suffix);
}
classes++;
--n;
}
}
static void
#ifdef __STDC__
ProcessArgs( int argc, char **argv, Opt *options )
#else
ProcessArgs( argc, argv, options )
int argc;
char **argv;
Opt *options;
#endif
{
Opt *p;
require(argv!=NULL, "ProcessArgs: command line NULL");
while ( argc-- > 0 )
{
p = options;
while ( p->option != NULL )
{
if ( strcmp(p->option, "*") == 0 ||
strcmp(p->option, *argv) == 0 )
{
if ( p->arg )
{
(*p->process)( *argv, *(argv+1) );
argv++;
argc--;
}
else
(*p->process)( *argv );
break;
}
p++;
}
argv++;
}
}
void fatal(char *err_)
{
fprintf(stderr, "genmk: %s\n", err_);
exit(1);
}
void warn(char *err_)
{
fprintf(stderr, "genmk: %s\n", err_);
}
char *DIR()
{
static char buf[200+1];
if ( strcmp(outdir,TopDirectory)==0 ) return "";
sprintf(buf, "%s", outdir);
return buf;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?