DIRECTORY ParseDefs USING [Value, Value2], TreesDefs USING [MakeNode]; ParseExpr1Impl: PROGRAM IMPORTS TreesDefs EXPORTS ParseDefs = { -- the interpretation rules ParseExpr1: PUBLIC PROCEDURE [rule: CARDINAL, top: CARDINAL, v: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value, v2: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value2] = { temp: ParseDefs.Value; temp2: ParseDefs.Value2; atemp: LONG POINTER TO ParseDefs.Value ← @temp; avtop: LONG POINTER TO ParseDefs.Value ← @v[top]; SELECT rule FROM -- EXPRESSIONS -- 98 => -- eL1 ::= eL2 -- eL2 ::=C eL3 -- eL3 ::= eL4 -- eL4 ::=C eL5 -- eL5 ::= eL6 -- eL6 ::=C eL7 -- eL7 ::= eL8 -- eL8 ::=C eL9 -- eL9 ::= eL10 -- eL10 ::=C eL11 -- eL11 ::= eL12 -- eL12 ::=C eL13 -- eL13 ::= eL14 -- eL14 ::=C eL15 NULL; 99 => -- EOrEmpty ::= { v2[top] ← NIL; }; 100 => -- EOrEmpty ::= e NULL; 101 => -- elist ::= e { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType ← eList; v2[top].lastInList ← v2[top]; }; 102 => -- elist ::= elist , e { temp2 ← TreesDefs.MakeNode[left: v2[top + 2], right: NIL, string: NIL, nodeType: operation]; temp2.operationType ← eList; v2[top].lastInList.right ← temp2; v2[top].lastInList ← temp2; }; 103 => -- e ::=C eL1 NULL; --124 => e ::= e , eL1 -- { -- }; -- OP ASSIGNS -- 104 => -- eL1 ::= eL2 "*=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← multiplyAssign; }; 105 => -- eL1 ::= eL2 "/=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← divideAssign; }; 106 => -- eL1 ::= eL2 "%=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← modulusAssign; }; 107 => -- eL1 ::= eL2 "+=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← plusAssign; }; 108 => -- eL1 ::= eL2 "-=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← minusAssign; }; 109 => -- eL1 ::= eL2 "<<=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← shiftLeftAssign; }; 110 => -- eL1 ::= eL2 ">>=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← shiftRightAssign; }; 111 => -- eL1 ::= eL2 "&=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitAndAssign; }; 112 => -- eL1 ::= eL2 "|=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitOrAssign; }; 113 => -- eL1 ::= eL2 "↑=" eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitXorAssign; }; -- ASSIGNMENT -- 114 => -- eL1 ::= eL2 = eL1 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← assignOp; }; -- IF / THEN / ELSE EXPRESSION -- 115 => -- eL2 ::= eL3 '? eL3 : eL2 { temp2 ← TreesDefs.MakeNode[left: v2[top + 2], right: v2[top + 4], string: NIL, nodeType: operation]; temp2.operationType ← thenElseExpression; v2[top] ← TreesDefs.MakeNode[left: v2[top], right: temp2, string: NIL, nodeType: operation]; v2[top].operationType ← ifExpression; }; -- LOGICAL OPERATORS -- 116 => -- eL3 ::= eL3 "||" eL4 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← logicalOr; }; 117 => -- eL4 ::= eL4 "&&" eL5 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← logicalAnd; }; -- BITWISE LOGICAL OPERATORS -- 118 => -- eL5 ::= eL5 '| eL6 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitOr; }; 119 => -- eL6 ::= eL6 ↑ eL7 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitXor; }; 120 => -- eL7 ::= eL7 & eL8 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← bitAnd; }; -- EQUALITY OPERATORS -- 121 => -- eL8 ::= eL8 "==" eL9 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← equals; }; 122 => -- eL8 ::= eL8 "!=" eL9 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← notEquals; }; -- RELATIONAL OPERATORS -- 123 => -- eL9 ::= eL9 < eL10 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← lessThan; }; 124 => -- eL9 ::= eL9 > eL10 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← greaterThan; }; 125 => -- eL9 ::= eL9 "<=" eL10 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← lessThanOrEqual; }; 126 => -- eL9 ::= eL9 ">=" eL10 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← greaterThanOrEqual; }; -- BIT SHIFT OPERATORS -- 127 => -- eL10 ::= eL10 "<<" eL11 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← shiftLeft; }; 128 => -- eL10 ::= eL10 ">>" eL11 { v2[top] ← TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType ← shiftRight; }; ENDCASE => ERROR; }; }.