|
|
@@ -1719,104 +1719,128 @@ Listing:
|
|
|
1702 qr)
|
|
|
1703 END
|
|
|
1704 END;
|
|
|
- 1705 t := SymTab.IntType();
|
|
|
- 1706 QbeGen.CopyOp(qr, q)
|
|
|
- 1707 END; .)
|
|
|
- 1708 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
- 1709 | SetLit<st, sq> (. t := st;
|
|
|
- 1710 QbeGen.CopyOp(sq, q); .)
|
|
|
- 1711 | "NOT" Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
- 1712 t := SymTab.BoolType()
|
|
|
- 1713 ELSE SemError(212);
|
|
|
- 1714 t := SymTab.InvalidType END;
|
|
|
- 1715 IF t # SymTab.InvalidType THEN
|
|
|
- 1716 QbeGen.NotQ(q2, q)
|
|
|
- 1717 ELSE QbeGen.CopyOp("0", q)
|
|
|
- 1718 END; .) .
|
|
|
- 1719 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
- 1720 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
- 1721 for computed elements. Ranges always lower via SetRange. *)
|
|
|
- 1722 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
- 1723 = "{" (. t := SymTab.NewSet(
|
|
|
- 1724 SymTab.NewSubR(0, 255));
|
|
|
- 1725 QbeGen.NewSetTemp(8, q);
|
|
|
- 1726 QbeGen.SetZero(q, 8); .)
|
|
|
- 1727 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
- 1728 "}" .
|
|
|
- 1729 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
- 1730 qe, q2: QbeGen.QVal;
|
|
|
- 1731 v, v2: INTEGER;
|
|
|
- 1732 lo: INTEGER;
|
|
|
- 1733 span: CARDINAL;
|
|
|
- 1734 cl, cl2: INTEGER;
|
|
|
- 1735 hasR: BOOLEAN; .)
|
|
|
- 1736 = (. hasR := FALSE; .)
|
|
|
- 1737 Expr<et, qe>
|
|
|
- 1738 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
- 1739 (. lo := SymTab.SetBaseLo(st);
|
|
|
- 1740 span := SymTab.SetCount(st);
|
|
|
- 1741 IF (et = SymTab.InvalidType)
|
|
|
- 1742 OR (hasR & (et2 =
|
|
|
- 1743 SymTab.InvalidType)) THEN
|
|
|
- 1744 ELSE cl :=
|
|
|
- 1745 SymTab.ClassOf(et);
|
|
|
- 1746 IF hasR THEN
|
|
|
- 1747 cl2 :=
|
|
|
- 1748 SymTab.ClassOf(et2)
|
|
|
- 1749 ELSE cl2 := SymTab.ClInt
|
|
|
- 1750 END;
|
|
|
- 1751 IF ((cl # SymTab.ClInt)
|
|
|
- 1752 & (cl # SymTab.ClChar)
|
|
|
- 1753 & (cl # SymTab.ClBool))
|
|
|
- 1754 OR (hasR &
|
|
|
- 1755 ((cl2
|
|
|
- 1756 # SymTab.ClInt)
|
|
|
- 1757 & (cl2
|
|
|
- 1758 # SymTab.ClChar)
|
|
|
- 1759 & (cl2
|
|
|
- 1760 # SymTab.ClBool))) THEN
|
|
|
- 1761 SemError(222)
|
|
|
- 1762 ELSIF hasR
|
|
|
- 1763 & SymTab.ConstInt(qe, v)
|
|
|
- 1764 & SymTab.ConstInt(q2,
|
|
|
- 1765 v2)
|
|
|
- 1766 & ((v < lo)
|
|
|
- 1767 OR (v2 < lo)
|
|
|
- 1768 OR (v >= lo +
|
|
|
- 1769 VAL(INTEGER, span))
|
|
|
- 1770 OR (v2 >= lo +
|
|
|
- 1771 VAL(INTEGER, span))
|
|
|
- 1772 OR (v > v2)) THEN
|
|
|
- 1773 SemError(222)
|
|
|
- 1774 ELSIF hasR THEN
|
|
|
- 1775 QbeGen.SetRange(sq, qe, q2,
|
|
|
- 1776 lo, span)
|
|
|
- 1777 ELSIF SymTab.ConstInt(qe,
|
|
|
- 1778 v)
|
|
|
- 1779 & ((v < lo)
|
|
|
- 1780 OR (v >= lo +
|
|
|
- 1781 VAL(INTEGER,
|
|
|
- 1782 span))) THEN
|
|
|
- 1783 SemError(222)
|
|
|
- 1784 ELSE QbeGen.SetBit(sq, qe,
|
|
|
- 1785 lo, span)
|
|
|
- 1786 END
|
|
|
- 1787 END; .) .
|
|
|
- 1788 GetIdent<VAR n: SymTab.Name>
|
|
|
- 1789 = ident (. LexName(n); .) .
|
|
|
- 1790
|
|
|
- 1791 END M2.
|
|
|
+ 1705 t := SymTab.IntType();
|
|
|
+ 1706 QbeGen.CopyOp(qr, q)
|
|
|
+ 1707 END; .)
|
|
|
+ 1708 | ( "SIZE" | "TSIZE" ) "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
+ 1709 (. IF dt = SymTab.InvalidType THEN
|
|
|
+ 1710 t := SymTab.InvalidType;
|
|
|
+ 1711 QbeGen.CopyOp("0", q)
|
|
|
+ 1712 ELSE
|
|
|
+ 1713 QbeGen.IntStr(VAL(INTEGER,
|
|
|
+ 1714 SymTab.ObjectSize(dt)), q);
|
|
|
+ 1715 t := SymTab.IntType()
|
|
|
+ 1716 END; .)
|
|
|
+ 1717 | "ADR" "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
+ 1718 (. IF dt = SymTab.InvalidType THEN
|
|
|
+ 1719 t := SymTab.InvalidType;
|
|
|
+ 1720 QbeGen.CopyOp("0", q)
|
|
|
+ 1721 ELSE
|
|
|
+ 1722 IF sfx THEN
|
|
|
+ 1723 QbeGen.CopyOp(qd, q)
|
|
|
+ 1724 ELSIF (dk = SymTab.KindVar)
|
|
|
+ 1725 OR (dk = SymTab.KindParam) THEN
|
|
|
+ 1726 QbeGen.AddrOf(qn, q)
|
|
|
+ 1727 ELSE SemError(230);
|
|
|
+ 1728 QbeGen.CopyOp("0", q)
|
|
|
+ 1729 END;
|
|
|
+ 1730 t := SymTab.AddrType()
|
|
|
+ 1731 END; .)
|
|
|
+ 1732 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
+ 1733 | SetLit<st, sq> (. t := st;
|
|
|
+ 1734 QbeGen.CopyOp(sq, q); .)
|
|
|
+ 1735 | "NOT" Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
+ 1736 t := SymTab.BoolType()
|
|
|
+ 1737 ELSE SemError(212);
|
|
|
+ 1738 t := SymTab.InvalidType END;
|
|
|
+ 1739 IF t # SymTab.InvalidType THEN
|
|
|
+ 1740 QbeGen.NotQ(q2, q)
|
|
|
+ 1741 ELSE QbeGen.CopyOp("0", q)
|
|
|
+ 1742 END; .) .
|
|
|
+ 1743 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
+ 1744 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
+ 1745 for computed elements. Ranges always lower via SetRange. *)
|
|
|
+ 1746 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
+ 1747 = "{" (. t := SymTab.NewSet(
|
|
|
+ 1748 SymTab.NewSubR(0, 255));
|
|
|
+ 1749 QbeGen.NewSetTemp(8, q);
|
|
|
+ 1750 QbeGen.SetZero(q, 8); .)
|
|
|
+ 1751 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
+ 1752 "}" .
|
|
|
+ 1753 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
+ 1754 qe, q2: QbeGen.QVal;
|
|
|
+ 1755 v, v2: INTEGER;
|
|
|
+ 1756 lo: INTEGER;
|
|
|
+ 1757 span: CARDINAL;
|
|
|
+ 1758 cl, cl2: INTEGER;
|
|
|
+ 1759 hasR: BOOLEAN; .)
|
|
|
+ 1760 = (. hasR := FALSE; .)
|
|
|
+ 1761 Expr<et, qe>
|
|
|
+ 1762 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
+ 1763 (. lo := SymTab.SetBaseLo(st);
|
|
|
+ 1764 span := SymTab.SetCount(st);
|
|
|
+ 1765 IF (et = SymTab.InvalidType)
|
|
|
+ 1766 OR (hasR & (et2 =
|
|
|
+ 1767 SymTab.InvalidType)) THEN
|
|
|
+ 1768 ELSE cl :=
|
|
|
+ 1769 SymTab.ClassOf(et);
|
|
|
+ 1770 IF hasR THEN
|
|
|
+ 1771 cl2 :=
|
|
|
+ 1772 SymTab.ClassOf(et2)
|
|
|
+ 1773 ELSE cl2 := SymTab.ClInt
|
|
|
+ 1774 END;
|
|
|
+ 1775 IF ((cl # SymTab.ClInt)
|
|
|
+ 1776 & (cl # SymTab.ClChar)
|
|
|
+ 1777 & (cl # SymTab.ClBool))
|
|
|
+ 1778 OR (hasR &
|
|
|
+ 1779 ((cl2
|
|
|
+ 1780 # SymTab.ClInt)
|
|
|
+ 1781 & (cl2
|
|
|
+ 1782 # SymTab.ClChar)
|
|
|
+ 1783 & (cl2
|
|
|
+ 1784 # SymTab.ClBool))) THEN
|
|
|
+ 1785 SemError(222)
|
|
|
+ 1786 ELSIF hasR
|
|
|
+ 1787 & SymTab.ConstInt(qe, v)
|
|
|
+ 1788 & SymTab.ConstInt(q2,
|
|
|
+ 1789 v2)
|
|
|
+ 1790 & ((v < lo)
|
|
|
+ 1791 OR (v2 < lo)
|
|
|
+ 1792 OR (v >= lo +
|
|
|
+ 1793 VAL(INTEGER, span))
|
|
|
+ 1794 OR (v2 >= lo +
|
|
|
+ 1795 VAL(INTEGER, span))
|
|
|
+ 1796 OR (v > v2)) THEN
|
|
|
+ 1797 SemError(222)
|
|
|
+ 1798 ELSIF hasR THEN
|
|
|
+ 1799 QbeGen.SetRange(sq, qe, q2,
|
|
|
+ 1800 lo, span)
|
|
|
+ 1801 ELSIF SymTab.ConstInt(qe,
|
|
|
+ 1802 v)
|
|
|
+ 1803 & ((v < lo)
|
|
|
+ 1804 OR (v >= lo +
|
|
|
+ 1805 VAL(INTEGER,
|
|
|
+ 1806 span))) THEN
|
|
|
+ 1807 SemError(222)
|
|
|
+ 1808 ELSE QbeGen.SetBit(sq, qe,
|
|
|
+ 1809 lo, span)
|
|
|
+ 1810 END
|
|
|
+ 1811 END; .) .
|
|
|
+ 1812 GetIdent<VAR n: SymTab.Name>
|
|
|
+ 1813 = ident (. LexName(n); .) .
|
|
|
+ 1814
|
|
|
+ 1815 END M2.
|
|
|
|
|
|
0 errors
|
|
|
|
|
|
|
|
|
Statistics:
|
|
|
|
|
|
- nr of terminals: 78 (limit 400)
|
|
|
+ nr of terminals: 81 (limit 400)
|
|
|
nr of non-terminals: 73 (limit 210)
|
|
|
- nr of pragmas: 0 (limit 422)
|
|
|
- nr of symbolnodes: 151 (limit 500)
|
|
|
- nr of graphnodes: 681 (limit 1500)
|
|
|
+ nr of pragmas: 0 (limit 419)
|
|
|
+ nr of symbolnodes: 154 (limit 500)
|
|
|
+ nr of graphnodes: 696 (limit 1500)
|
|
|
nr of conditionsets: 7 (limit 100)
|
|
|
nr of charactersets: 11 (limit 250)
|
|
|
|