|
|
@@ -1604,185 +1604,216 @@ Listing:
|
|
|
1587 et, dt, t2, st, ct2:
|
|
|
1588 SymTab.TypeIndex;
|
|
|
1589 dk: INTEGER;
|
|
|
- 1590 qd, q2, sq, qa, qm0:
|
|
|
+ 1590 qd, q2, sq, qa, qm0, qr:
|
|
|
1591 QbeGen.QVal;
|
|
|
1592 qn: SymTab.Name;
|
|
|
- 1593 called, sfx: BOOLEAN; .)
|
|
|
- 1594 = integer (. LexString(s);
|
|
|
- 1595 QbeGen.NormInt(s, q);
|
|
|
- 1596 t := SymTab.IntType(); .)
|
|
|
- 1597 | real (. LexString(s);
|
|
|
- 1598 QbeGen.NormReal(s, q);
|
|
|
- 1599 t := SymTab.RealType(); .)
|
|
|
- 1600 | string (. LexString(s);
|
|
|
- 1601 IF SymTab.StrLen(s) = 3 THEN
|
|
|
- 1602 t := SymTab.CharType();
|
|
|
- 1603 QbeGen.IntStr(
|
|
|
- 1604 QbeGen.CharVal(s), q)
|
|
|
- 1605 ELSE t := SymTab.NewStr();
|
|
|
- 1606 QbeGen.DeclStr(s, q);
|
|
|
- 1607 (* a literal's value IS its
|
|
|
- 1608 static descriptor address *)
|
|
|
- 1609 QbeGen.NoteAddr(q, q)
|
|
|
- 1610 END; .)
|
|
|
- 1611 | Design<dt, dk, qd, qn, sfx> (. called := FALSE;
|
|
|
- 1612 t := dt;
|
|
|
- 1613 IF sfx THEN
|
|
|
- 1614 IF dt =
|
|
|
- 1615 SymTab.InvalidType THEN
|
|
|
- 1616 QbeGen.CopyOp("0", q)
|
|
|
- 1617 ELSIF (SymTab.ClassOf(dt) =
|
|
|
- 1618 SymTab.ClRecord)
|
|
|
- 1619 OR (SymTab.ClassOf(dt) =
|
|
|
- 1620 SymTab.ClSet)
|
|
|
- 1621 OR (SymTab.ClassOf(dt) =
|
|
|
- 1622 SymTab.ClClass) THEN
|
|
|
- 1623 QbeGen.CopyOp(qd, q)
|
|
|
- 1624 ELSE QbeGen.ElemLoad(qd, dt,
|
|
|
- 1625 q)
|
|
|
- 1626 END
|
|
|
- 1627 ELSE QbeGen.CopyOp(qd, q)
|
|
|
- 1628 END;
|
|
|
- 1629 IF (dk = SymTab.KindVar)
|
|
|
- 1630 OR (dk = SymTab.KindParam)
|
|
|
- 1631 OR (dk =
|
|
|
- 1632 SymTab.KindField) THEN
|
|
|
- 1633 IF sfx THEN
|
|
|
- 1634 QbeGen.NoteAddr(q, qd)
|
|
|
- 1635 ELSE
|
|
|
- 1636 QbeGen.AddrOf(qn, qa);
|
|
|
- 1637 QbeGen.NoteAddr(q, qa)
|
|
|
- 1638 END
|
|
|
- 1639 ELSIF sfx
|
|
|
- 1640 & (dt #
|
|
|
- 1641 SymTab.InvalidType)
|
|
|
- 1642 & ((SymTab.ClassOf(dt) =
|
|
|
- 1643 SymTab.ClArray)
|
|
|
- 1644 OR (SymTab.ClassOf(dt) =
|
|
|
- 1645 SymTab.ClSet)
|
|
|
- 1646 OR (SymTab.ClassOf(dt) =
|
|
|
- 1647 SymTab.ClRecord)) THEN
|
|
|
- 1648 QbeGen.NoteAddr(qd, qd)
|
|
|
- 1649 END; .)
|
|
|
- 1650 [ ArgList<qn, TRUE, ct2, q2, called>
|
|
|
- 1651 (. t := ct2;
|
|
|
- 1652 QbeGen.CopyOp(q2, q); .) ]
|
|
|
- 1653 (. IF ~called
|
|
|
- 1654 & (dk = SymTab.KindProc) THEN
|
|
|
- 1655 (* bare zero-arg function
|
|
|
- 1656 call (parentheses may be
|
|
|
- 1657 omitted); a proper or
|
|
|
- 1658 parameterised proc here
|
|
|
- 1659 is 230 *)
|
|
|
- 1660 IF (SymTab.ProcNPar(qn) = 0)
|
|
|
- 1661 & (SymTab.ProcRes(qn) #
|
|
|
- 1662 SymTab.InvalidType) THEN
|
|
|
- 1663 QbeGen.Mangled(qn,
|
|
|
- 1664 SymTab.ProcUid(qn), qm0);
|
|
|
- 1665 QbeGen.CallBegin(qm0,
|
|
|
- 1666 SymTab.ProcRes(qn),
|
|
|
- 1667 SymTab.ProcDepthOf(qn),
|
|
|
- 1668 SymTab.IsExternal(qn));
|
|
|
- 1669 QbeGen.CallEnd(TRUE, q);
|
|
|
- 1670 t := SymTab.ProcRes(qn)
|
|
|
- 1671 ELSE SemError(230)
|
|
|
- 1672 END
|
|
|
- 1673 END; .)
|
|
|
- 1674 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
- 1675 | SetLit<st, sq> (. t := st;
|
|
|
- 1676 QbeGen.CopyOp(sq, q); .)
|
|
|
- 1677 | "NOT" Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
- 1678 t := SymTab.BoolType()
|
|
|
- 1679 ELSE SemError(212);
|
|
|
- 1680 t := SymTab.InvalidType END;
|
|
|
- 1681 IF t # SymTab.InvalidType THEN
|
|
|
- 1682 QbeGen.NotQ(q2, q)
|
|
|
- 1683 ELSE QbeGen.CopyOp("0", q)
|
|
|
- 1684 END; .) .
|
|
|
- 1685 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
- 1686 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
- 1687 for computed elements. Ranges always lower via SetRange. *)
|
|
|
- 1688 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
- 1689 = "{" (. t := SymTab.NewSet(
|
|
|
- 1690 SymTab.NewSubR(0, 255));
|
|
|
- 1691 QbeGen.NewSetTemp(8, q);
|
|
|
- 1692 QbeGen.SetZero(q, 8); .)
|
|
|
- 1693 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
- 1694 "}" .
|
|
|
- 1695 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
- 1696 qe, q2: QbeGen.QVal;
|
|
|
- 1697 v, v2: INTEGER;
|
|
|
- 1698 lo: INTEGER;
|
|
|
- 1699 span: CARDINAL;
|
|
|
- 1700 cl, cl2: INTEGER;
|
|
|
- 1701 hasR: BOOLEAN; .)
|
|
|
- 1702 = (. hasR := FALSE; .)
|
|
|
- 1703 Expr<et, qe>
|
|
|
- 1704 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
- 1705 (. lo := SymTab.SetBaseLo(st);
|
|
|
- 1706 span := SymTab.SetCount(st);
|
|
|
- 1707 IF (et = SymTab.InvalidType)
|
|
|
- 1708 OR (hasR & (et2 =
|
|
|
- 1709 SymTab.InvalidType)) THEN
|
|
|
- 1710 ELSE cl :=
|
|
|
- 1711 SymTab.ClassOf(et);
|
|
|
- 1712 IF hasR THEN
|
|
|
- 1713 cl2 :=
|
|
|
- 1714 SymTab.ClassOf(et2)
|
|
|
- 1715 ELSE cl2 := SymTab.ClInt
|
|
|
- 1716 END;
|
|
|
- 1717 IF ((cl # SymTab.ClInt)
|
|
|
- 1718 & (cl # SymTab.ClChar)
|
|
|
- 1719 & (cl # SymTab.ClBool))
|
|
|
- 1720 OR (hasR &
|
|
|
- 1721 ((cl2
|
|
|
- 1722 # SymTab.ClInt)
|
|
|
- 1723 & (cl2
|
|
|
- 1724 # SymTab.ClChar)
|
|
|
- 1725 & (cl2
|
|
|
- 1726 # SymTab.ClBool))) THEN
|
|
|
- 1727 SemError(222)
|
|
|
- 1728 ELSIF hasR
|
|
|
- 1729 & SymTab.ConstInt(qe, v)
|
|
|
- 1730 & SymTab.ConstInt(q2,
|
|
|
- 1731 v2)
|
|
|
- 1732 & ((v < lo)
|
|
|
- 1733 OR (v2 < lo)
|
|
|
- 1734 OR (v >= lo +
|
|
|
- 1735 VAL(INTEGER, span))
|
|
|
- 1736 OR (v2 >= lo +
|
|
|
- 1737 VAL(INTEGER, span))
|
|
|
- 1738 OR (v > v2)) THEN
|
|
|
- 1739 SemError(222)
|
|
|
- 1740 ELSIF hasR THEN
|
|
|
- 1741 QbeGen.SetRange(sq, qe, q2,
|
|
|
- 1742 lo, span)
|
|
|
- 1743 ELSIF SymTab.ConstInt(qe,
|
|
|
- 1744 v)
|
|
|
- 1745 & ((v < lo)
|
|
|
- 1746 OR (v >= lo +
|
|
|
- 1747 VAL(INTEGER,
|
|
|
- 1748 span))) THEN
|
|
|
- 1749 SemError(222)
|
|
|
- 1750 ELSE QbeGen.SetBit(sq, qe,
|
|
|
- 1751 lo, span)
|
|
|
- 1752 END
|
|
|
- 1753 END; .) .
|
|
|
- 1754 GetIdent<VAR n: SymTab.Name>
|
|
|
- 1755 = ident (. LexName(n); .) .
|
|
|
- 1756
|
|
|
- 1757 END M2.
|
|
|
+ 1593 called, isHigh, sfx:
|
|
|
+ 1594 BOOLEAN; .)
|
|
|
+ 1595 = integer (. LexString(s);
|
|
|
+ 1596 QbeGen.NormInt(s, q);
|
|
|
+ 1597 t := SymTab.IntType(); .)
|
|
|
+ 1598 | real (. LexString(s);
|
|
|
+ 1599 QbeGen.NormReal(s, q);
|
|
|
+ 1600 t := SymTab.RealType(); .)
|
|
|
+ 1601 | string (. LexString(s);
|
|
|
+ 1602 IF SymTab.StrLen(s) = 3 THEN
|
|
|
+ 1603 t := SymTab.CharType();
|
|
|
+ 1604 QbeGen.IntStr(
|
|
|
+ 1605 QbeGen.CharVal(s), q)
|
|
|
+ 1606 ELSE t := SymTab.NewStr();
|
|
|
+ 1607 QbeGen.DeclStr(s, q);
|
|
|
+ 1608 (* a literal's value IS its
|
|
|
+ 1609 static descriptor address *)
|
|
|
+ 1610 QbeGen.NoteAddr(q, q)
|
|
|
+ 1611 END; .)
|
|
|
+ 1612 | Design<dt, dk, qd, qn, sfx> (. called := FALSE;
|
|
|
+ 1613 t := dt;
|
|
|
+ 1614 IF sfx THEN
|
|
|
+ 1615 IF dt =
|
|
|
+ 1616 SymTab.InvalidType THEN
|
|
|
+ 1617 QbeGen.CopyOp("0", q)
|
|
|
+ 1618 ELSIF (SymTab.ClassOf(dt) =
|
|
|
+ 1619 SymTab.ClRecord)
|
|
|
+ 1620 OR (SymTab.ClassOf(dt) =
|
|
|
+ 1621 SymTab.ClSet)
|
|
|
+ 1622 OR (SymTab.ClassOf(dt) =
|
|
|
+ 1623 SymTab.ClClass) THEN
|
|
|
+ 1624 QbeGen.CopyOp(qd, q)
|
|
|
+ 1625 ELSE QbeGen.ElemLoad(qd, dt,
|
|
|
+ 1626 q)
|
|
|
+ 1627 END
|
|
|
+ 1628 ELSE QbeGen.CopyOp(qd, q)
|
|
|
+ 1629 END;
|
|
|
+ 1630 IF (dk = SymTab.KindVar)
|
|
|
+ 1631 OR (dk = SymTab.KindParam)
|
|
|
+ 1632 OR (dk =
|
|
|
+ 1633 SymTab.KindField) THEN
|
|
|
+ 1634 IF sfx THEN
|
|
|
+ 1635 QbeGen.NoteAddr(q, qd)
|
|
|
+ 1636 ELSE
|
|
|
+ 1637 QbeGen.AddrOf(qn, qa);
|
|
|
+ 1638 QbeGen.NoteAddr(q, qa)
|
|
|
+ 1639 END
|
|
|
+ 1640 ELSIF sfx
|
|
|
+ 1641 & (dt #
|
|
|
+ 1642 SymTab.InvalidType)
|
|
|
+ 1643 & ((SymTab.ClassOf(dt) =
|
|
|
+ 1644 SymTab.ClArray)
|
|
|
+ 1645 OR (SymTab.ClassOf(dt) =
|
|
|
+ 1646 SymTab.ClSet)
|
|
|
+ 1647 OR (SymTab.ClassOf(dt) =
|
|
|
+ 1648 SymTab.ClRecord)) THEN
|
|
|
+ 1649 QbeGen.NoteAddr(qd, qd)
|
|
|
+ 1650 END; .)
|
|
|
+ 1651 [ ArgList<qn, TRUE, ct2, q2, called>
|
|
|
+ 1652 (. t := ct2;
|
|
|
+ 1653 QbeGen.CopyOp(q2, q); .) ]
|
|
|
+ 1654 (. IF ~called
|
|
|
+ 1655 & (dk = SymTab.KindProc) THEN
|
|
|
+ 1656 (* bare zero-arg function
|
|
|
+ 1657 call (parentheses may be
|
|
|
+ 1658 omitted); a proper or
|
|
|
+ 1659 parameterised proc here
|
|
|
+ 1660 is 230 *)
|
|
|
+ 1661 IF (SymTab.ProcNPar(qn) = 0)
|
|
|
+ 1662 & (SymTab.ProcRes(qn) #
|
|
|
+ 1663 SymTab.InvalidType) THEN
|
|
|
+ 1664 QbeGen.Mangled(qn,
|
|
|
+ 1665 SymTab.ProcUid(qn), qm0);
|
|
|
+ 1666 QbeGen.CallBegin(qm0,
|
|
|
+ 1667 SymTab.ProcRes(qn),
|
|
|
+ 1668 SymTab.ProcDepthOf(qn),
|
|
|
+ 1669 SymTab.IsExternal(qn));
|
|
|
+ 1670 QbeGen.CallEnd(TRUE, q);
|
|
|
+ 1671 t := SymTab.ProcRes(qn)
|
|
|
+ 1672 ELSE SemError(230)
|
|
|
+ 1673 END
|
|
|
+ 1674 END; .)
|
|
|
+ 1675 | ( "HIGH" (. isHigh := TRUE; .)
|
|
|
+ 1676 | "LEN" (. isHigh := FALSE; .) )
|
|
|
+ 1677 "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
+ 1678 (. IF dt = SymTab.InvalidType THEN
|
|
|
+ 1679 ELSIF SymTab.ClassOf(dt) #
|
|
|
+ 1680 SymTab.ClArray THEN
|
|
|
+ 1681 SemError(217);
|
|
|
+ 1682 t := SymTab.InvalidType;
|
|
|
+ 1683 QbeGen.CopyOp("0", q)
|
|
|
+ 1684 ELSE
|
|
|
+ 1685 IF isHigh THEN
|
|
|
+ 1686 IF SymTab.IsOpenArray(dt) THEN
|
|
|
+ 1687 QbeGen.OpenHi(qd, qr)
|
|
|
+ 1688 ELSE
|
|
|
+ 1689 QbeGen.IntStr(
|
|
|
+ 1690 SymTab.ArrayHi(dt), qr)
|
|
|
+ 1691 END
|
|
|
+ 1692 ELSE
|
|
|
+ 1693 IF SymTab.IsOpenArray(dt) THEN
|
|
|
+ 1694 QbeGen.LoadCount(qd, qr)
|
|
|
+ 1695 ELSE
|
|
|
+ 1696 QbeGen.IntStr(VAL(
|
|
|
+ 1697 INTEGER,
|
|
|
+ 1698 SymTab.ArrayLen(dt)),
|
|
|
+ 1699 qr)
|
|
|
+ 1700 END
|
|
|
+ 1701 END;
|
|
|
+ 1702 t := SymTab.IntType();
|
|
|
+ 1703 QbeGen.CopyOp(qr, q)
|
|
|
+ 1704 END; .)
|
|
|
+ 1705 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
+ 1706 | SetLit<st, sq> (. t := st;
|
|
|
+ 1707 QbeGen.CopyOp(sq, q); .)
|
|
|
+ 1708 | "NOT" Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
+ 1709 t := SymTab.BoolType()
|
|
|
+ 1710 ELSE SemError(212);
|
|
|
+ 1711 t := SymTab.InvalidType END;
|
|
|
+ 1712 IF t # SymTab.InvalidType THEN
|
|
|
+ 1713 QbeGen.NotQ(q2, q)
|
|
|
+ 1714 ELSE QbeGen.CopyOp("0", q)
|
|
|
+ 1715 END; .) .
|
|
|
+ 1716 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
+ 1717 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
+ 1718 for computed elements. Ranges always lower via SetRange. *)
|
|
|
+ 1719 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
+ 1720 = "{" (. t := SymTab.NewSet(
|
|
|
+ 1721 SymTab.NewSubR(0, 255));
|
|
|
+ 1722 QbeGen.NewSetTemp(8, q);
|
|
|
+ 1723 QbeGen.SetZero(q, 8); .)
|
|
|
+ 1724 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
+ 1725 "}" .
|
|
|
+ 1726 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
+ 1727 qe, q2: QbeGen.QVal;
|
|
|
+ 1728 v, v2: INTEGER;
|
|
|
+ 1729 lo: INTEGER;
|
|
|
+ 1730 span: CARDINAL;
|
|
|
+ 1731 cl, cl2: INTEGER;
|
|
|
+ 1732 hasR: BOOLEAN; .)
|
|
|
+ 1733 = (. hasR := FALSE; .)
|
|
|
+ 1734 Expr<et, qe>
|
|
|
+ 1735 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
+ 1736 (. lo := SymTab.SetBaseLo(st);
|
|
|
+ 1737 span := SymTab.SetCount(st);
|
|
|
+ 1738 IF (et = SymTab.InvalidType)
|
|
|
+ 1739 OR (hasR & (et2 =
|
|
|
+ 1740 SymTab.InvalidType)) THEN
|
|
|
+ 1741 ELSE cl :=
|
|
|
+ 1742 SymTab.ClassOf(et);
|
|
|
+ 1743 IF hasR THEN
|
|
|
+ 1744 cl2 :=
|
|
|
+ 1745 SymTab.ClassOf(et2)
|
|
|
+ 1746 ELSE cl2 := SymTab.ClInt
|
|
|
+ 1747 END;
|
|
|
+ 1748 IF ((cl # SymTab.ClInt)
|
|
|
+ 1749 & (cl # SymTab.ClChar)
|
|
|
+ 1750 & (cl # SymTab.ClBool))
|
|
|
+ 1751 OR (hasR &
|
|
|
+ 1752 ((cl2
|
|
|
+ 1753 # SymTab.ClInt)
|
|
|
+ 1754 & (cl2
|
|
|
+ 1755 # SymTab.ClChar)
|
|
|
+ 1756 & (cl2
|
|
|
+ 1757 # SymTab.ClBool))) THEN
|
|
|
+ 1758 SemError(222)
|
|
|
+ 1759 ELSIF hasR
|
|
|
+ 1760 & SymTab.ConstInt(qe, v)
|
|
|
+ 1761 & SymTab.ConstInt(q2,
|
|
|
+ 1762 v2)
|
|
|
+ 1763 & ((v < lo)
|
|
|
+ 1764 OR (v2 < lo)
|
|
|
+ 1765 OR (v >= lo +
|
|
|
+ 1766 VAL(INTEGER, span))
|
|
|
+ 1767 OR (v2 >= lo +
|
|
|
+ 1768 VAL(INTEGER, span))
|
|
|
+ 1769 OR (v > v2)) THEN
|
|
|
+ 1770 SemError(222)
|
|
|
+ 1771 ELSIF hasR THEN
|
|
|
+ 1772 QbeGen.SetRange(sq, qe, q2,
|
|
|
+ 1773 lo, span)
|
|
|
+ 1774 ELSIF SymTab.ConstInt(qe,
|
|
|
+ 1775 v)
|
|
|
+ 1776 & ((v < lo)
|
|
|
+ 1777 OR (v >= lo +
|
|
|
+ 1778 VAL(INTEGER,
|
|
|
+ 1779 span))) THEN
|
|
|
+ 1780 SemError(222)
|
|
|
+ 1781 ELSE QbeGen.SetBit(sq, qe,
|
|
|
+ 1782 lo, span)
|
|
|
+ 1783 END
|
|
|
+ 1784 END; .) .
|
|
|
+ 1785 GetIdent<VAR n: SymTab.Name>
|
|
|
+ 1786 = ident (. LexName(n); .) .
|
|
|
+ 1787
|
|
|
+ 1788 END M2.
|
|
|
|
|
|
0 errors
|
|
|
|
|
|
|
|
|
Statistics:
|
|
|
|
|
|
- nr of terminals: 76 (limit 400)
|
|
|
+ nr of terminals: 78 (limit 400)
|
|
|
nr of non-terminals: 73 (limit 210)
|
|
|
- nr of pragmas: 0 (limit 424)
|
|
|
- nr of symbolnodes: 149 (limit 500)
|
|
|
- nr of graphnodes: 670 (limit 1500)
|
|
|
+ nr of pragmas: 0 (limit 422)
|
|
|
+ nr of symbolnodes: 151 (limit 500)
|
|
|
+ nr of graphnodes: 681 (limit 1500)
|
|
|
nr of conditionsets: 7 (limit 100)
|
|
|
nr of charactersets: 11 (limit 250)
|
|
|
|