|
@@ -448,6 +448,8 @@ PROCEDURE ConsCode (nm: ARRAY OF CHAR): INTEGER;
|
|
|
IF SymTab.Equal(nm, "ORDINAL") THEN RETURN 1
|
|
IF SymTab.Equal(nm, "ORDINAL") THEN RETURN 1
|
|
|
ELSIF SymTab.Equal(nm, "INTEGER") THEN RETURN 2
|
|
ELSIF SymTab.Equal(nm, "INTEGER") THEN RETURN 2
|
|
|
ELSIF SymTab.Equal(nm, "REAL") THEN RETURN 3
|
|
ELSIF SymTab.Equal(nm, "REAL") THEN RETURN 3
|
|
|
|
|
+ ELSIF SymTab.Equal(nm, "POINTER") THEN RETURN 4
|
|
|
|
|
+ ELSIF SymTab.Equal(nm, "SCALAR") THEN RETURN 5
|
|
|
END;
|
|
END;
|
|
|
RETURN 0
|
|
RETURN 0
|
|
|
END ConsCode;
|
|
END ConsCode;
|
|
@@ -459,6 +461,14 @@ PROCEDURE ConsOk (cons: INTEGER; t: SymTab.TypeIndex): BOOLEAN;
|
|
|
ELSIF cons = 1 THEN RETURN SymTab.IsOrdinal(t)
|
|
ELSIF cons = 1 THEN RETURN SymTab.IsOrdinal(t)
|
|
|
ELSIF cons = 2 THEN RETURN SymTab.ClassOf(t) = SymTab.ClInt
|
|
ELSIF cons = 2 THEN RETURN SymTab.ClassOf(t) = SymTab.ClInt
|
|
|
ELSIF cons = 3 THEN RETURN SymTab.ClassOf(t) = SymTab.ClReal
|
|
ELSIF cons = 3 THEN RETURN SymTab.ClassOf(t) = SymTab.ClReal
|
|
|
|
|
+ ELSIF cons = 4 THEN RETURN SymTab.ClassOf(t) = SymTab.ClPtr
|
|
|
|
|
+ ELSIF cons = 5 THEN
|
|
|
|
|
+ RETURN (SymTab.ClassOf(t) = SymTab.ClInt)
|
|
|
|
|
+ OR (SymTab.ClassOf(t) = SymTab.ClChar)
|
|
|
|
|
+ OR (SymTab.ClassOf(t) = SymTab.ClBool)
|
|
|
|
|
+ OR (SymTab.ClassOf(t) = SymTab.ClEnum)
|
|
|
|
|
+ OR (SymTab.ClassOf(t) = SymTab.ClUChar)
|
|
|
|
|
+ OR (SymTab.ClassOf(t) = SymTab.ClReal)
|
|
|
END;
|
|
END;
|
|
|
RETURN TRUE
|
|
RETURN TRUE
|
|
|
END ConsOk;
|
|
END ConsOk;
|
|
@@ -681,6 +691,9 @@ PRODUCTIONS
|
|
|
aKind: INTEGER;
|
|
aKind: INTEGER;
|
|
|
amod: SymTab.Name;
|
|
amod: SymTab.Name;
|
|
|
nm2: SymTab.Name;
|
|
nm2: SymTab.Name;
|
|
|
|
|
+ qu, qd: CARDINAL;
|
|
|
|
|
+ qr: SymTab.TypeIndex;
|
|
|
|
|
+ qe: BOOLEAN;
|
|
|
k: CARDINAL; .)
|
|
k: CARDINAL; .)
|
|
|
= (. isV := FALSE; at := SymTab.InvalidType;
|
|
= (. isV := FALSE; at := SymTab.InvalidType;
|
|
|
nm[0] := CHR(0); nm2[0] := CHR(0);
|
|
nm[0] := CHR(0); nm2[0] := CHR(0);
|
|
@@ -695,9 +708,21 @@ PRODUCTIONS
|
|
|
(. isV := FALSE; at := SymTab.InvalidType;
|
|
(. isV := FALSE; at := SymTab.InvalidType;
|
|
|
aKind := 0; amod[0] := CHR(0);
|
|
aKind := 0; amod[0] := CHR(0);
|
|
|
IF nm2[0] # CHR(0) THEN
|
|
IF nm2[0] # CHR(0) THEN
|
|
|
- (* qualified procedure actual:
|
|
|
|
|
- Mod.Proc, no import needed *)
|
|
|
|
|
- aKind := 2;
|
|
|
|
|
|
|
+ (* qualified actual Mod.Name:
|
|
|
|
|
+ a nested instance's type
|
|
|
|
|
+ (Mod.Type) or a procedure
|
|
|
|
|
+ (Mod.Proc); no import
|
|
|
|
|
+ needed *)
|
|
|
|
|
+ IF SymTab.QualProcInfo(nm, nm2,
|
|
|
|
|
+ qu, qd, qr, qe) THEN
|
|
|
|
|
+ aKind := 2
|
|
|
|
|
+ ELSE at := SymTab.QualType(nm, nm2);
|
|
|
|
|
+ IF at # SymTab.InvalidType THEN
|
|
|
|
|
+ aKind := 0
|
|
|
|
|
+ ELSE SemError(201);
|
|
|
|
|
+ aKind := 0; at := SymTab.InvalidType
|
|
|
|
|
+ END
|
|
|
|
|
+ END;
|
|
|
CopyNm(nm, amod);
|
|
CopyNm(nm, amod);
|
|
|
CopyNm(nm2, nm)
|
|
CopyNm(nm2, nm)
|
|
|
ELSIF SymTab.Lookup(nm)
|
|
ELSIF SymTab.Lookup(nm)
|