|
|
@@ -908,8 +908,14 @@ PRODUCTIONS
|
|
|
OR (dk = SymTab.KindField) THEN
|
|
|
IF SymTab.ClassOf(dt) =
|
|
|
SymTab.ClArray THEN
|
|
|
- QbeGen.CopyArray(qd, qe,
|
|
|
- dt)
|
|
|
+ IF SymTab.StrCompat(dt,
|
|
|
+ et) THEN
|
|
|
+ QbeGen.StrAssign(qd,
|
|
|
+ qe)
|
|
|
+ ELSE
|
|
|
+ QbeGen.CopyArray(qd,
|
|
|
+ qe, dt)
|
|
|
+ END
|
|
|
ELSIF SymTab.ClassOf(dt) =
|
|
|
SymTab.ClSet THEN
|
|
|
QbeGen.CopySet(qd, qe,
|
|
|
@@ -936,7 +942,13 @@ PRODUCTIONS
|
|
|
END
|
|
|
ELSIF SymTab.ClassOf(dt) =
|
|
|
SymTab.ClArray THEN
|
|
|
- QbeGen.CopyArray(qd, qe, dt)
|
|
|
+ IF SymTab.StrCompat(dt,
|
|
|
+ et) THEN
|
|
|
+ QbeGen.StrAssign(qd, qe)
|
|
|
+ ELSE
|
|
|
+ QbeGen.CopyArray(qd, qe,
|
|
|
+ dt)
|
|
|
+ END
|
|
|
ELSIF SymTab.ClassOf(dt) =
|
|
|
SymTab.ClSet THEN
|
|
|
QbeGen.CopySet(qd, qe,
|
|
|
@@ -1788,6 +1800,25 @@ PRODUCTIONS
|
|
|
QbeGen.CopyOp(qr, q)
|
|
|
ELSE QbeGen.DelayFlush; QbeGen.CopyOp("0", q)
|
|
|
END
|
|
|
+ ELSIF (op = SymTab.OpAdd)
|
|
|
+ AND (SymTab.StrCompat(t, t2)
|
|
|
+ OR (SymTab.IsStrType(t)
|
|
|
+ AND (SymTab.ClassOf(t2) = SymTab.ClChar))
|
|
|
+ OR ((SymTab.ClassOf(t) = SymTab.ClChar)
|
|
|
+ AND SymTab.IsStrType(t2))) THEN
|
|
|
+ (* string concatenation; a CHAR operand becomes a
|
|
|
+ 1-character string literal *)
|
|
|
+ IF SymTab.StrCompat(t, t2) THEN
|
|
|
+ QbeGen.StrCat(q, q2, qt)
|
|
|
+ ELSIF SymTab.IsStrType(t) THEN
|
|
|
+ QbeGen.DeclCharStr(q2, qs);
|
|
|
+ QbeGen.StrCat(q, qs, qt)
|
|
|
+ ELSE
|
|
|
+ QbeGen.DeclCharStr(q, qs);
|
|
|
+ QbeGen.StrCat(qs, q2, qt)
|
|
|
+ END;
|
|
|
+ t := SymTab.NewStr();
|
|
|
+ QbeGen.CopyOp(qt, q)
|
|
|
ELSIF (t # SymTab.InvalidType) AND (t2 # SymTab.InvalidType)
|
|
|
AND (SymTab.ClassOf(t) = SymTab.ClSet)
|
|
|
AND (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
|
|
|
@@ -1974,7 +2005,7 @@ PRODUCTIONS
|
|
|
vt: SymTab.TypeIndex;
|
|
|
c1, c2: INTEGER;
|
|
|
called, isHigh, sfx, isCh,
|
|
|
- isU, uok: BOOLEAN;
|
|
|
+ isU, uok, isStr: BOOLEAN;
|
|
|
ucp: INTEGER; .)
|
|
|
= integer (. LexString(s);
|
|
|
QbeGen.NormInt(s, q);
|
|
|
@@ -2085,8 +2116,39 @@ PRODUCTIONS
|
|
|
END; .)
|
|
|
| ( "HIGH" (. isHigh := TRUE; .)
|
|
|
| ( "LEN" | "LENGTH" ) (. isHigh := FALSE; .) )
|
|
|
- "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
- (. IF dt = SymTab.InvalidType THEN
|
|
|
+ "(" ( Design<dt, dk, qd, qn, sfx> (. isStr := FALSE; .)
|
|
|
+ | string (. LexString(s);
|
|
|
+ isStr := TRUE;
|
|
|
+ IF SymTab.StrLen(s) = 3 THEN
|
|
|
+ dt := SymTab.CharType();
|
|
|
+ QbeGen.IntStr(QbeGen.CharVal(s),
|
|
|
+ qd)
|
|
|
+ ELSE
|
|
|
+ dt := SymTab.NewStr();
|
|
|
+ QbeGen.DeclStr(s, qd);
|
|
|
+ QbeGen.NoteAddr(qd, qd)
|
|
|
+ END;
|
|
|
+ dk := -1;
|
|
|
+ qn[0] := CHR(0); .) )
|
|
|
+ ")"
|
|
|
+ (. IF isStr THEN
|
|
|
+ (* fold: content length at
|
|
|
+ compile time *)
|
|
|
+ IF SymTab.StrLen(s) = 3 THEN
|
|
|
+ c1 := 1
|
|
|
+ ELSE
|
|
|
+ c1 :=
|
|
|
+ SymTab.StrLen(s) - 2
|
|
|
+ END;
|
|
|
+ IF isHigh THEN
|
|
|
+ DEC(c1)
|
|
|
+ END;
|
|
|
+ QbeGen.IntStr(c1, qr);
|
|
|
+ t := SymTab.IntType();
|
|
|
+ QbeGen.CopyOp(qr, q)
|
|
|
+ ELSIF dt = SymTab.InvalidType THEN
|
|
|
+ t := SymTab.InvalidType;
|
|
|
+ QbeGen.CopyOp("0", q)
|
|
|
ELSIF SymTab.ClassOf(dt) #
|
|
|
SymTab.ClArray THEN
|
|
|
SemError(217);
|