|
|
@@ -3,9 +3,10 @@ COMPILER M2c
|
|
|
(see MGen for details).
|
|
|
|
|
|
- program module only, no DEFINITION / IMPLEMENTATION split
|
|
|
- - local MODULEs (single-file, no nesting, no bodies): EXPORT of
|
|
|
- VARs, CONSTs, TYPEs and procedures (value/VAR params, functions,
|
|
|
- open array formals with fixed actuals); use as M.x / M.P(args);
|
|
|
+ - local MODULEs (single-file, no nesting): EXPORT of VARs, CONSTs,
|
|
|
+ TYPEs and procedures (value/VAR params, functions, open array
|
|
|
+ formals with fixed actuals); use as M.x / M.P(args); optional
|
|
|
+ BEGIN..END init bodies run at startup in declaration order;
|
|
|
no PRIORITY
|
|
|
- procedures: declarations (nested), value and VAR parameters,
|
|
|
functions with RETURN, recursion, FORWARD headings;
|
|
|
@@ -254,10 +255,13 @@ PRODUCTIONS
|
|
|
SymTab.CloseProc;
|
|
|
MGen.DefLabel(endL); .) ) .
|
|
|
ModuleDecl (. VAR n, m, e: SymTab.Name;
|
|
|
- noMod, enterOk: BOOLEAN; .)
|
|
|
+ noMod, enterOk,
|
|
|
+ hasInit: BOOLEAN;
|
|
|
+ initL, initN: INTEGER; .)
|
|
|
= "MODULE" (. noMod := SymTab.InProc()
|
|
|
OR SymTab.InModule();
|
|
|
- enterOk := FALSE; .)
|
|
|
+ enterOk := FALSE;
|
|
|
+ hasInit := FALSE; .)
|
|
|
GetIdent<n> (. IF noMod THEN
|
|
|
SemError(230)
|
|
|
ELSIF ~SymTab.EnterModule(n) THEN
|
|
|
@@ -278,10 +282,24 @@ PRODUCTIONS
|
|
|
END; .) } ]
|
|
|
";"
|
|
|
{ Declaration }
|
|
|
+ [ "BEGIN" (. hasInit := TRUE;
|
|
|
+ IF ~noMod & enterOk THEN
|
|
|
+ initL := MGen.NewLabel();
|
|
|
+ MGen.Jmp(initL);
|
|
|
+ initN := MGen.ModInitBegin();
|
|
|
+ IF initN < 0 THEN
|
|
|
+ SemError(230)
|
|
|
+ END
|
|
|
+ END; .)
|
|
|
+ StatSeq ]
|
|
|
"END"
|
|
|
GetIdent<m> (. IF ~SymTab.Equal(n, m) THEN
|
|
|
SemError(202)
|
|
|
END;
|
|
|
+ IF hasInit & ~noMod & enterOk THEN
|
|
|
+ MGen.ModInitEnd(initN);
|
|
|
+ MGen.DefLabel(initL)
|
|
|
+ END;
|
|
|
IF ~noMod & enterOk THEN
|
|
|
IF ~SymTab.ExitModule() THEN
|
|
|
SemError(201)
|
|
|
@@ -341,9 +359,15 @@ PRODUCTIONS
|
|
|
IF SymTab.ExpKind(n, m)
|
|
|
= SymTab.KindType THEN
|
|
|
t := SymTab.ExpType(n, m)
|
|
|
+ ELSIF SymTab.SelfKind(n, m)
|
|
|
+ = SymTab.KindType THEN
|
|
|
+ t := SymTab.SymType(m)
|
|
|
ELSE
|
|
|
- IF SymTab.ExpKind(n, m) = -1 THEN
|
|
|
- SemError(201)
|
|
|
+ IF SymTab.ExpKind(n, m) < 0 THEN
|
|
|
+ IF SymTab.SelfKind(n, m) < 0 THEN
|
|
|
+ SemError(201)
|
|
|
+ ELSE SemError(221)
|
|
|
+ END
|
|
|
ELSE SemError(221)
|
|
|
END;
|
|
|
t := SymTab.InvalidType
|
|
|
@@ -840,6 +864,13 @@ PRODUCTIONS
|
|
|
IF isModP THEN
|
|
|
modPNum := SymTab.ExpProc(pn,
|
|
|
exp);
|
|
|
+ IF (modPNum < 0)
|
|
|
+ & (SymTab.SelfKind(pn,
|
|
|
+ exp)
|
|
|
+ = SymTab.KindProc) THEN
|
|
|
+ modPNum :=
|
|
|
+ SymTab.ProcNum(exp)
|
|
|
+ END;
|
|
|
IF modPNum < 0 THEN
|
|
|
IF SymTab.ExpKind(pn,
|
|
|
exp) # -1 THEN
|
|
|
@@ -1442,6 +1473,7 @@ PRODUCTIONS
|
|
|
esl, ebytes: CARDINAL;
|
|
|
firstT: BOOLEAN;
|
|
|
clsI: INTEGER;
|
|
|
+ sk: INTEGER;
|
|
|
qM: SymTab.Name; .)
|
|
|
= (. sfx := FALSE; .)
|
|
|
{ "." (. firstT := ~sfx;
|
|
|
@@ -1462,13 +1494,37 @@ PRODUCTIONS
|
|
|
END; .)
|
|
|
GetIdent<m> (. IF (k = SymTab.KindModule) THEN
|
|
|
IF SymTab.ExpKind(bn, m) = -1 THEN
|
|
|
- SemError(201);
|
|
|
- MGen.CopyName(m, lx);
|
|
|
- t := SymTab.InvalidType;
|
|
|
- IF doLoad THEN
|
|
|
- MGen.Drop; MGen.PushInt(0)
|
|
|
- ELSIF firstT THEN
|
|
|
- ELSE MGen.Drop
|
|
|
+ sk := SymTab.SelfKind(bn, m);
|
|
|
+ IF sk = SymTab.KindProc THEN
|
|
|
+ MGen.CopyName(m, lx);
|
|
|
+ t := SymTab.InvalidType;
|
|
|
+ IF doLoad THEN
|
|
|
+ MGen.Drop; MGen.PushInt(0)
|
|
|
+ ELSIF firstT THEN
|
|
|
+ ELSE MGen.Drop
|
|
|
+ END
|
|
|
+ ELSIF sk # -1 THEN
|
|
|
+ t := SymTab.SymType(m);
|
|
|
+ k := sk;
|
|
|
+ SymTab.SelfQual(m, qM);
|
|
|
+ IF doLoad THEN
|
|
|
+ MGen.Drop;
|
|
|
+ MGen.GlobalAddr(qM)
|
|
|
+ ELSE
|
|
|
+ IF firstT THEN
|
|
|
+ ELSE MGen.Drop
|
|
|
+ END;
|
|
|
+ MGen.GlobalAddr(qM)
|
|
|
+ END
|
|
|
+ ELSE
|
|
|
+ SemError(201);
|
|
|
+ MGen.CopyName(m, lx);
|
|
|
+ t := SymTab.InvalidType;
|
|
|
+ IF doLoad THEN
|
|
|
+ MGen.Drop; MGen.PushInt(0)
|
|
|
+ ELSIF firstT THEN
|
|
|
+ ELSE MGen.Drop
|
|
|
+ END
|
|
|
END
|
|
|
ELSIF SymTab.ExpKind(bn, m)
|
|
|
= SymTab.KindProc THEN
|
|
|
@@ -1900,7 +1956,7 @@ PRODUCTIONS
|
|
|
lxD, lx2: MGen.LitStr;
|
|
|
v2: BOOLEAN;
|
|
|
vn2: SymTab.Name;
|
|
|
- vi: INTEGER;
|
|
|
+ vi, mpF: INTEGER;
|
|
|
c: CARDINAL;
|
|
|
b: LONGCARD;
|
|
|
sfxF: BOOLEAN;
|
|
|
@@ -2029,12 +2085,20 @@ PRODUCTIONS
|
|
|
ELSIF (SymTab.SymKind(bnF)
|
|
|
= SymTab.KindModule)
|
|
|
& sfxF
|
|
|
- & (SymTab.StrLen(lxD) > 0)
|
|
|
- & (SymTab.ExpProc(bnF,
|
|
|
- lxD) >= 0) THEN
|
|
|
- t := SymTab.ProcRetByNum(
|
|
|
- SymTab.ExpProc(bnF,
|
|
|
- lxD))
|
|
|
+ & (SymTab.StrLen(lxD) > 0) THEN
|
|
|
+ mpF := SymTab.ExpProc(bnF,
|
|
|
+ lxD);
|
|
|
+ IF (mpF < 0)
|
|
|
+ & (SymTab.SelfKind(bnF,
|
|
|
+ lxD)
|
|
|
+ = SymTab.KindProc) THEN
|
|
|
+ mpF := SymTab.ProcNum(lxD)
|
|
|
+ END;
|
|
|
+ IF mpF >= 0 THEN
|
|
|
+ t := SymTab.ProcRetByNum(mpF)
|
|
|
+ ELSE
|
|
|
+ t := SymTab.InvalidType
|
|
|
+ END
|
|
|
ELSE
|
|
|
t := SymTab.InvalidType
|
|
|
END
|