From 4e0c9a780ac82997eaa9352c5d515468b3b0b580 Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 17 Feb 1988 17:21:51 +0000 Subject: [PATCH] fixes and other mods --- lang/m2/m2mm/LLlex.c | 6 +- lang/m2/m2mm/declar.g | 122 +++++++++++++------------ lang/m2/m2mm/expression.g | 46 +++++----- lang/m2/m2mm/f_info.h | 4 +- lang/m2/m2mm/file_list.h | 24 ++++- lang/m2/m2mm/lib.c | 2 +- lang/m2/m2mm/main.c | 185 ++++++++++++++++++++++---------------- lang/m2/m2mm/options.c | 10 +-- lang/m2/m2mm/program.g | 11 +-- 9 files changed, 232 insertions(+), 178 deletions(-) diff --git a/lang/m2/m2mm/LLlex.c b/lang/m2/m2mm/LLlex.c index 77088ddd0..7a03c7ce1 100644 --- a/lang/m2/m2mm/LLlex.c +++ b/lang/m2/m2mm/LLlex.c @@ -340,7 +340,11 @@ again: if (is_hex(ch)) { state = Hex; } - else state = End; + else { + ch = 'D'; + state = End; + PushBack(); + } break; case Hex: diff --git a/lang/m2/m2mm/declar.g b/lang/m2/m2mm/declar.g index 3b5984f69..7cf77dafb 100644 --- a/lang/m2/m2mm/declar.g +++ b/lang/m2/m2mm/declar.g @@ -20,21 +20,27 @@ ProcedureHeading : [ ';' FPSection ]* - ]? + | + ] ')' - [ ':' qualtype - ]? - ]? + [ + ':' qualtype + | + /* empty */ + ] + | + /* empty */ + ] ; block : - [ %persistent + [ %persistent declaration ]* - [ %default - BEGIN - StatementSequence + [ %default + BEGIN StatementSequence | + /* empty */ ] END ; @@ -46,10 +52,7 @@ declaration : | VAR [ VariableDeclaration ';' ]* | - ProcedureHeading ';' - block - IDENT - ';' + ProcedureHeading ';' block IDENT ';' | ModuleDeclaration ';' ; @@ -65,12 +68,12 @@ FormalType : ; TypeDeclaration : - IDENT - '=' type + IDENT '=' type ; type : - %default SimpleType + %default + SimpleType | ArrayType | @@ -86,7 +89,7 @@ type : SimpleType : qualtype [ - /* nothing */ + /* empty */ | SubrangeType /* The subrange type is given a base type by the @@ -115,22 +118,19 @@ SubrangeType : This is not exactly the rule in the new report, but see the rule for "SimpleType". */ - '[' ConstExpression - UPTO ConstExpression - ']' + '[' ConstExpression UPTO ConstExpression ']' ; ArrayType : ARRAY SimpleType [ ',' SimpleType - ]* OF type + ]* + OF type ; RecordType : - RECORD - FieldListSequence - END + RECORD FieldListSequence END ; FieldListSequence : @@ -141,40 +141,49 @@ FieldListSequence : ; FieldList : -[ IdentList ':' type | CASE /* Also accept old fashioned Modula-2 syntax, but give a warning. Sorry for the complicated code. */ - [ qualident - [ ':' qualtype + [ + qualident + [ + ':' qualtype /* This is correct, in both kinds of Modula-2, if the first qualident is a single identifier. */ - | /* Old fashioned! the first qualident now represents + | + /* empty */ + /* Old fashioned! the first qualident now represents the type */ - ] - | ':' qualtype - /* Aha, third edition. Well done! */ + ] + | + ':' qualtype + /* Aha, third edition. Well done! */ ] OF variant [ - '|' variant + '|' variant ]* - [ ELSE FieldListSequence - ]? + [ + ELSE FieldListSequence + | + /* empty */ + ] END -]? +| + /* empty */ ; variant : [ - CaseLabelList - ':' FieldListSequence - ]? + CaseLabelList ':' FieldListSequence + | + /* empty */ + ] /* Changed rule in new modula-2 */ ; @@ -188,9 +197,10 @@ CaseLabelList : CaseLabels : ConstExpression [ - UPTO - ConstExpression - ]? + UPTO ConstExpression + | + /* empty */ + ] ; SetType : @@ -214,6 +224,7 @@ ProcedureType : [ FormalTypeList | + /* empty */ ] ; @@ -224,29 +235,29 @@ FormalTypeList : [ ',' VarFormalType ]* - ]? + | + /* empty */ + ] ')' - [ ':' qualtype + [ + ':' qualtype | + /* empty */ ] ; VarFormalType : - var - FormalType + var FormalType ; var : - [ - VAR - | - /* empty */ - ] + VAR +| + /* empty */ ; ConstantDeclaration : - IDENT - '=' ConstExpression + IDENT '=' ConstExpression ; VariableDeclaration : @@ -259,8 +270,9 @@ VariableDeclaration : IdentAddr : IDENT - [ '[' - ConstExpression - ']' - ]? + [ + '[' ConstExpression ']' + | + /* empty */ + ] ; diff --git a/lang/m2/m2mm/expression.g b/lang/m2/m2mm/expression.g index 3fe53ee33..9311a1853 100644 --- a/lang/m2/m2mm/expression.g +++ b/lang/m2/m2mm/expression.g @@ -25,8 +25,7 @@ selector : ExpList : expression [ - ',' - expression + ',' expression ]* ; @@ -43,18 +42,23 @@ expression : /* relation */ [ '=' | '#' | '<' | LESSEQUAL | '>' | GREATEREQUAL | IN ] SimpleExpression - ]? + | + /* empty */ + ] ; SimpleExpression : [ - [ '+' | '-' ] - ]? + '+' + | + '-' + | + /* empty */ + ] term [ /* AddOperator */ - [ '+' | '-' | OR ] - term + [ '+' | '-' | OR ] term ]* ; @@ -62,8 +66,7 @@ term : factor [ /* MulOperator */ - [ '*' | '/' | DIV | MOD | AND ] - factor + [ '*' | '/' | DIV | MOD | AND ] factor ]* ; @@ -73,15 +76,16 @@ factor : designator_tail? [ ActualParameters - ]? + | + /* empty */ + ] | bare_set ] | bare_set | %default - [ - %default + [ %default INTEGER | REAL @@ -101,7 +105,9 @@ bare_set : [ ',' element ]* - ]? + | + /* empty */ + ] '}' ; @@ -112,20 +118,20 @@ ActualParameters : element : expression [ - UPTO - expression - ]? + UPTO expression + | + /* empty */ + ] ; designator : - qualident - designator_tail? + qualident designator_tail? ; designator_tail : visible_designator_tail [ %persistent - %default + %default selector | visible_designator_tail @@ -133,7 +139,6 @@ designator_tail : ; visible_designator_tail : -[ '[' expression [ @@ -142,5 +147,4 @@ visible_designator_tail : ']' | '^' -] ; diff --git a/lang/m2/m2mm/f_info.h b/lang/m2/m2mm/f_info.h index 452d8a3fe..588832a1e 100644 --- a/lang/m2/m2mm/f_info.h +++ b/lang/m2/m2mm/f_info.h @@ -11,11 +11,11 @@ struct f_info { unsigned short f_lineno; - char *f_filename; + char *f_fn; char *f_workingdir; }; extern struct f_info file_info; #define LineNumber file_info.f_lineno -#define FileName file_info.f_filename +#define FileName file_info.f_fn #define WorkingDir file_info.f_workingdir diff --git a/lang/m2/m2mm/file_list.h b/lang/m2/m2mm/file_list.h index 9529e8c56..0e1aff17e 100644 --- a/lang/m2/m2mm/file_list.h +++ b/lang/m2/m2mm/file_list.h @@ -1,6 +1,22 @@ +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + * + * Author: Ceriel J.H. Jacobs + */ + +/* F I L E L I S T S T R U C T U R E */ + struct file_list { - char *a_filename; - char *a_dir; - struct idf *a_idf; - struct file_list *a_next; + char *a_filename; /* name of file */ + char *a_dir; /* directory in which it resides */ + struct idf *a_idf; /* its idf-structure */ + struct file_list *a_next; /* next in list */ }; + +#define f_walk(list, ctrl) \ + for (ctrl = (list); ctrl; ctrl = ctrl->a_next) + +#define f_filename(a) ((a)->a_filename) +#define f_idf(a) ((a)->a_idf) +#define f_dir(a) ((a)->a_dir) diff --git a/lang/m2/m2mm/lib.c b/lang/m2/m2mm/lib.c index 3666e80ba..b47157315 100644 --- a/lang/m2/m2mm/lib.c +++ b/lang/m2/m2mm/lib.c @@ -20,7 +20,7 @@ is_library_dir(d) "system" definition modules. Return 1 if it is, 0 otherwise. */ - return strcmp(lib_dir, d) == 0 ? 1 : 0; + return strcmp(lib_dir, d) == 0; } init_lib() diff --git a/lang/m2/m2mm/main.c b/lang/m2/m2mm/main.c index 406b85922..2f1aaf02f 100644 --- a/lang/m2/m2mm/main.c +++ b/lang/m2/m2mm/main.c @@ -117,13 +117,13 @@ Add(parglist, f, d, copy) char *f, *d; struct file_list **parglist; { - register struct file_list *a = *parglist, *b = 0; + register struct file_list *a, *b = 0; if (f == 0) return; - while (a && strcmp(a->a_filename, f) != 0) { + f_walk(*parglist, a) { + if (strcmp(f_filename(a), f) == 0) break; b = a; - a = a->a_next; } if (a) return 0; a = new_file_list(); @@ -139,45 +139,55 @@ Add(parglist, f, d, copy) return 1; } -ProcessArgs() +int +openfile(a) + register struct file_list *a; { - register struct file_list *a = arglist; char *fn; + register struct file_list *p, *prev = 0; + + if (! InsertFile(f_filename(a), DEFPATH, &fn)) { + Gerror("Could not find %s", f_filename(a)); + f_walk(arglist, p) { + if (p == a) { + if (! prev) arglist = p->a_next; + else prev->a_next = a->a_next; + break; + } + prev = p; + } + return 0; + } + FileName = fn; + LineNumber = 1; + a->a_dir = WorkingDir = getwdir(FileName); + return 1; +} + +ProcessArgs() +{ + register struct file_list *a; - while (a) { - register char *p = strrindex(a->a_filename, '.'); + f_walk(arglist, a) { + register char *p = strrindex(f_filename(a), '.'); CurrentArg = a; - DEFPATH[0] = a->a_dir; + DEFPATH[0] = f_dir(a); if ( p && strcmp(p, ".def") == 0) { ForeignFlag = 0; - if (! InsertFile(a->a_filename, DEFPATH, &fn)) { - Gerror("Could not find %s", a->a_filename); - a->a_filename = ""; - a = a->a_next; + if (! openfile(a)) { continue; } - FileName = fn; - a->a_dir = WorkingDir = getwdir(FileName); DefModule(); } else if (p && strcmp(p, ".mod") == 0) { - if (! InsertFile(a->a_filename, DEFPATH, &fn)) { - Gerror("Could not find %s", a->a_filename); - *p = 0; - a->a_filename = Salloc(a->a_filename, - strlen(a->a_filename) + - (unsigned)11); - strcat(a->a_filename, ".$(SUFFIX)"); - a = a->a_next; + if (! openfile(a)) { + *p = 0; /* ??? */ continue; } - FileName = fn; - a->a_dir = WorkingDir = getwdir(FileName); CompUnit(); } - else fatal("No Modula-2 file: %s", a->a_filename); - a = a->a_next; + else fatal("No Modula-2 file: %s", f_filename(a)); } } @@ -207,23 +217,25 @@ AddToList(name, ext) find_dependencies() { - register struct file_list *arg = arglist; + register struct file_list *arg; print("\nall:\t"); - while (arg) { - char *dotspot = strrindex(arg->a_filename, '.'); + f_walk(arglist, arg) { + char *fn = f_filename(arg); + char *dotspot = strrindex(fn, '.'); if (dotspot && strcmp(dotspot, ".mod") == 0) { - register struct idf *id = arg->a_idf; + register struct idf *id = f_idf(arg); if (id) { if (id->id_type == PROGRAM) { - print("%s ", id->id_text); + *dotspot = 0; + print("%s ", fn); + *dotspot = '.'; } file_dep(id); } } - arg = arg->a_next; } print("\n\n"); } @@ -243,11 +255,11 @@ file_dep(id) register struct file_list *p; file_dep(iid); - for (p = iid->id_ddependson; p; p = p->a_next) { - Add(&(id->id_ddependson), p->a_filename, - p->a_dir, 0); - Add(&(id->id_mdependson), p->a_filename, - p->a_dir, 0); + f_walk(iid->id_ddependson, p) { + Add(&(id->id_ddependson), f_filename(p), + f_dir(p), 0); + Add(&(id->id_mdependson), f_filename(p), + f_dir(p), 0); } } } @@ -258,9 +270,9 @@ file_dep(id) register struct file_list *p; file_dep(iid); - for (p = iid->id_ddependson; p; p = p->a_next) { - Add(&(id->id_mdependson), p->a_filename, - p->a_dir, 0); + f_walk(iid->id_ddependson, p) { + Add(&(id->id_mdependson), f_filename(p), + f_dir(p), 0); } } } @@ -271,18 +283,18 @@ object(arg) register struct file_list *arg; { static char buf[512]; - char *dotp = strrindex(arg->a_filename, '.'); + char *dotp = strrindex(f_filename(arg), '.'); buf[0] = 0; /* - if (strcmp(arg->a_dir, ".") != 0) { - strcpy(buf, arg->a_dir); + if (strcmp(f_dir(arg), ".") != 0) { + strcpy(buf, f_dir(arg)); strcat(buf, "/"); } */ - *dotp = 0; - strcat(buf, arg->a_filename); - *dotp = '.'; + if (dotp) *dotp = 0; + strcat(buf, f_filename(arg)); + if (dotp) *dotp = '.'; strcat(buf, ".$(SUFFIX)"); return buf; } @@ -290,21 +302,21 @@ object(arg) pr_arg(a) register struct file_list *a; { - if (strcmp(a->a_dir, ".") == 0) { - print(a->a_filename); + if (strcmp(f_dir(a), ".") == 0) { + print(f_filename(a)); } - else print("%s/%s", a->a_dir, a->a_filename); + else print("%s/%s", f_dir(a), f_filename(a)); } print_dep() { - register struct file_list *arg = arglist; + register struct file_list *arg; - while (arg) { - char *dotspot = strrindex(arg->a_filename, '.'); + f_walk(arglist, arg) { + char *dotspot = strrindex(f_filename(arg), '.'); if (dotspot && strcmp(dotspot, ".mod") == 0) { - register struct idf *id = arg->a_idf; + register struct idf *id = f_idf(arg); if (id) { char *obj = object(arg); @@ -312,39 +324,44 @@ print_dep() print("%s: \\\n\t", obj); pr_arg(arg); - for (a = id->id_mdependson; a; a = a->a_next) { - if (*(a->a_filename)) { + f_walk(id->id_mdependson, a) { + if (*(f_filename(a))) /* ??? */ { print(" \\\n\t"); pr_arg(a); } } - print("\n\t$(MOD) -c $(M2FLAGS) $(IFLAGS) "); + print("\n\t$(MOD) -c.$(SUFFIX) $(M2FLAGS) $(IFLAGS) "); pr_arg(arg); print("\n"); } } - arg = arg->a_next; } } -prog_dep(id) +prog_dep(id, a) register struct idf *id; + struct file_list *a; { register struct lnk *m; register struct file_list *p; id->id_mdependson = 0; id->id_def = 0; - if (strlen(id->id_text) >= 10) id->id_text[10] = 0; - Add(&(id->id_mdependson), id->id_text, id->id_dir, 0); + if (id->id_type == PROGRAM) { + Add(&(id->id_mdependson), f_filename(a), f_dir(a), 0); + } + else { + if (strlen(id->id_text) >= 10) id->id_text[10] = 0; + Add(&(id->id_mdependson), id->id_text, id->id_dir, 0); + } for (m = id->id_modimports; m; m = m->lnk_next) { register struct idf *iid = m->lnk_imp; if (Add(&(id->id_mdependson), iid->id_text, iid->id_dir, 0)) { if (iid->id_def) prog_dep(iid); - for (p = iid->id_mdependson; p; p = p->a_next) { - Add(&(id->id_mdependson), p->a_filename, - p->a_dir, 0); + f_walk(iid->id_mdependson, p) { + Add(&(id->id_mdependson), f_filename(p), + f_dir(p), 0); } } } @@ -355,12 +372,12 @@ module_in_arglist(n) { register struct file_list *a; - for (a = arglist; a; a = a->a_next) { - char *dotp = strrindex(a->a_filename, '.'); + f_walk(arglist, a) { + char *dotp = strrindex(f_filename(a), '.'); if (dotp && strcmp(dotp, ".mod") == 0) { *dotp = 0; - if (strcmp(a->a_filename, n) == 0) { + if (strcmp(f_filename(a), n) == 0) { *dotp = '.'; return 1; } @@ -370,38 +387,48 @@ module_in_arglist(n) return 0; } -pr_prog_dep(id) +pr_prog_dep(id, a) register struct idf *id; + struct file_list *a; { register struct file_list *p; print("\nOBS_%s =", id->id_text); - for (p = id->id_mdependson; p; p = p->a_next) { - if (module_in_arglist(p->a_filename) || ! p->a_dir) { - print(" \\\n\t%s.$(SUFFIX)", p->a_filename); + f_walk(id->id_mdependson, p) { + if (module_in_arglist(f_filename(p)) || ! f_dir(p)) { + print(" \\\n\t%s", object(p)); + } + } + print("\n\nOBS2_%s =", id->id_text); + f_walk(id->id_mdependson, p) { + if (module_in_arglist(f_filename(p)) || ! f_dir(p)) { + /* nothing */ } - else if (! is_library_dir(p->a_dir)) { - print(" \\\n\t%s/%s.$(SUFFIX)", p->a_dir, p->a_filename); + else if (! is_library_dir(f_dir(p))) { + print(" \\\n\t%s/%s", f_dir(p), object(p)); } } print("\n\n"); - print("%s:\t$(OBS_%s)\n", id->id_text, id->id_text); - print("\t$(MOD) -.mod -o %s $(M2FLAGS) $(OBS_%s)\n", id->id_text, id->id_text); + print("o_files:\t$(OBS_%s)\n\n", id->id_text); + print("%s:\t$(OBS_%s) $(OBS2_%s)\n", id->id_text, id->id_text, id->id_text); + print("\t$(MOD) -.mod -o %s $(M2FLAGS) $(OBS_%s) $(OBS2_%s)\n", id->id_text, id->id_text, id->id_text); } programs() { register struct file_list *a; - for (a = arglist; a; a = a->a_next) { - char *dotspot = strrindex(a->a_filename, '.'); + f_walk(arglist, a) { + char *dotspot = strrindex(f_filename(a), '.'); if (dotspot && strcmp(dotspot, ".mod") == 0) { - register struct idf *id = a->a_idf; + register struct idf *id = f_idf(a); if (id && id->id_type == PROGRAM) { - prog_dep(id); - pr_prog_dep(id); + prog_dep(id, a); + /* *dotspot = 0; */ + pr_prog_dep(id, a); + /* *dotspot = '.'; */ } } } diff --git a/lang/m2/m2mm/options.c b/lang/m2/m2mm/options.c index e91a32483..d157f78b3 100644 --- a/lang/m2/m2mm/options.c +++ b/lang/m2/m2mm/options.c @@ -59,15 +59,9 @@ AddInclDir(text) } if (++nDEF > mDEF) { - char **n = (char **) - Malloc((unsigned)((10+mDEF)*sizeof(char *))); - - for (i = 0; i < mDEF; i++) { - n[i] = DEFPATH[i]; - } - free((char *) DEFPATH); - DEFPATH = n; mDEF += 10; + DEFPATH = (char **) Realloc((char *)DEFPATH, + (unsigned)(mDEF * sizeof(char *))); } i = ndirs++; diff --git a/lang/m2/m2mm/program.g b/lang/m2/m2mm/program.g index 9dfde93a9..8cc218fb8 100644 --- a/lang/m2/m2mm/program.g +++ b/lang/m2/m2mm/program.g @@ -51,19 +51,15 @@ new_lnk() %start DefModule, DefinitionModule; ModuleDeclaration : - MODULE IDENT - priority - ';' - import((struct lnk **) 0)* - export? - block - IDENT + MODULE IDENT priority ';' import((struct lnk **) 0)* export? + block IDENT ; priority: [ '[' ConstExpression ']' | + /* empty */ ] ; @@ -72,6 +68,7 @@ export : [ QUALIFIED | + /* empty */ ] IdentList ';' ; -- 2.34.1