DIRECTORY ParseDefs USING [Value, Value2], TreesDefs USING [MakeNode]; ParseExpr2Impl: PROGRAM IMPORTS TreesDefs EXPORTS ParseDefs = { -- the interpretation rules ParseExpr2: 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 -- ARITHMETIC OPERATORS -- 129 => -- eL11 ::= eL11 + eL12 { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ plusOp; }; 130 => -- eL11 ::= eL11 - eL12 { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ minusOp; }; 131 => -- eL12 ::= eL12 * eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ multiplyOp; }; 132 => -- eL12 ::= eL12 / eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ divideOp; }; 133 => -- eL12 ::= eL12 % eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ modulusOp; }; -- UNARY OPERATORS -- 134 => -- eL13 ::= "++" eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ preIncrement; }; 135 => -- eL13 ::= "!!" eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ preDecrement; }; 136 => -- eL13 ::= * eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ dereference; }; 137 => -- eL13 ::= & eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ addressOf; }; 138 => -- eL13 ::= - eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ unaryMinus; }; 139 => -- eL13 ::= ! eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ logicalNot; }; 140 => -- eL13 ::= ~ eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ bitNot; }; 141 => -- eL13 ::= sizeof eL13 { -- not legal in Mesa (what to do?) v2[top] _ TreesDefs.MakeNode[left: v2[top + 1], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ sizeOf; }; 142 => -- eL13 ::= ( CastType ) eL13 { v2[top] _ TreesDefs.MakeNode[left: v2[top + 3], right: v2[top + 1], string: NIL, nodeType: operation]; v2[top].operationType _ castOp; }; 143 => -- eL13 ::= sizeof ( CastType ) { v2[top] _ TreesDefs.MakeNode[left: v2[top + 2], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ sizeOf; }; -- RIGHT ASSOCIATIVE UNARY -- 144 => -- eL14 ::= eL14 "++" { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ postIncrement; }; 145 => -- eL14 ::= eL14 "!!" { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: NIL, string: NIL, nodeType: operation]; v2[top].operationType _ postDecrement; }; -- BASIC EXPRESSIONS -- 146 => -- eL15 ::= eL15 [ e ] { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 2], string: NIL, nodeType: operation]; v2[top].operationType _ arrayReference; }; 147 => -- eL15 ::= NAME ( ) { v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top], nodeType: operation]; v2[top].operationType _ procedureCall; }; 148 => -- eL15 ::= NAME ( elist ) { v2[top] _ TreesDefs.MakeNode[left: NIL, right: v2[top + 2], string: v[top], nodeType: operation]; v2[top].operationType _ procedureCall; }; 149 => -- eL15 ::= NAME { v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top], nodeType: operation]; v2[top].operationType _ nameValue; }; 150 => -- eL15 ::= ICON { v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top], nodeType: operation]; v2[top].operationType _ iconValue; }; 151 => -- eL15 ::= FCON { v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top], nodeType: operation]; v2[top].operationType _ fconValue; }; 152 => -- eL15 ::= STRING { v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top], nodeType: operation]; v2[top].operationType _ stringValue; }; 153 => -- eL15 ::= ( e ) { v2[top] _ v2[top + 1]; }; -- STRUCTURE REFERENCING OPERATORS -- 154 => -- eL15 ::= eL15 "->" NAME { temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top + 2], nodeType: operation]; temp2.operationType _ nameValue; v2[top] _ TreesDefs.MakeNode[left: v2[top], right: temp2, string: NIL, nodeType: operation]; v2[top].operationType _ structReference; }; 155 => -- eL15 ::= eL15 . NAME { temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: v[top + 2], nodeType: operation]; temp2.operationType _ nameValue; v2[top] _ TreesDefs.MakeNode[left: v2[top], right: temp2, string: NIL, nodeType: operation]; v2[top].operationType _ structReference; }; -- ABSTRACT DECLARATORS -- 156 => -- CastType ::= Type NullDeclarator { v2[top] _ TreesDefs.MakeNode[left: v2[top], right: v2[top + 1], string: NIL, nodeType: castType]; }; 157 => -- NullDeclarator ::= * NullDeclarator { temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: NIL, nodeType: declarator]; temp2.declaratorType _ pointerTo; v2[top] _ v2[top + 1]; v2[top].lastInList.right _ temp2; v2[top].lastInList _ temp2; }; 158 => -- NullDeclarator ::= ( NullDeclarator ) ( ) { temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: NIL, nodeType: declarator]; temp2.declaratorType _ functionOf; v2[top] _ v2[top + 1]; v2[top].lastInList.right _ temp2; v2[top].lastInList _ temp2; }; 159 => -- NullDeclarator ::= NullDeclarator [ ] { temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: NIL, nodeType: declarator]; temp2.declaratorType _ arrayOf; v2[top].lastInList.right _ temp2; v2[top].lastInList _ temp2; }; 160 => -- NullDeclarator ::= NullDeclarator [ e ] { temp2 _ TreesDefs.MakeNode[left: v2[top + 2], right: NIL, string: NIL, nodeType: declarator]; temp2.declaratorType _ arrayOf; v2[top].lastInList.right _ temp2; v2[top].lastInList _ temp2; }; 161 => -- NullDeclarator ::= ( ) { -- phony NAME holder (NAME in abstract declarators is empty) temp2 _ TreesDefs.MakeNode[left: NIL, right: NIL, string: NIL, nodeType: declarator]; temp2.declaratorType _ functionOf; v2[top] _ TreesDefs.MakeNode[left: NIL, right: temp2, string: NIL, nodeType: declarator]; v2[top].declaratorType _ simpleName; v2[top].lastInList _ temp2; }; 162 => -- NullDeclarator ::= { -- phony NAME holder (NAME in abstract declarators is empty) v2[top] _ TreesDefs.MakeNode[left: NIL, right: NIL, string: NIL, nodeType: declarator]; v2[top].declaratorType _ simpleName; v2[top].lastInList _ v2[top]; }; 163 => -- NullDeclarator ::= ( NullDeclarator ) { v2[top] _ v2[top + 1]; -- parens just for grouping v2[top + 1] _ NIL; }; ENDCASE => ERROR; }; }.