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; }; }.