DIRECTORY SymbolTableDefs USING [SymbolType]; TreesDefs: DEFINITIONS = { -- nodes for parse trees of C statments and declarations TreeNode: TYPE = RECORD [ left, right: LONG POINTER TO TreeNode, -- this is used to insert at end of various types of lists lastInList: LONG POINTER TO TreeNode, string: LONG STRING, -- these are some booleans for data type -- TRUE if this word appears in the data declaration char, short, int, long, unsigned, float, double: BOOLEAN, class: Class, structure, union, enumeration: BOOLEAN, declaratorType: DeclaratorType, -- defined below operationType: OperationType, -- defined below nodeType: NodeType, -- defined below dataType: SymbolTableDefs.SymbolType, baseDataType: SymbolTableDefs.SymbolType, typeString: LONG STRING, pointerCount: CARDINAL ]; -- the nesting shows subtree types NodeType: TYPE = { -- declaration node types -- dclList, -- (declaration,next dclList) declaration, -- (attributes, dclItemList) attributes, -- (-,dclList) if a structure definition -- or (-.-) string = NAME dclItemList, -- (itemHead,next dclItemList) itemHead, -- (declarator,initList) declarator, -- (-,next declarator) initList, -- (initializer,next initList) initializer, -- (-,initList) or (expression.-) -- statement node types -- castType, -- (type,nullDeclaration) eList, -- (operation,next eList) operation, -- (left operand,right operand) ifStmt, -- (condition expression, thenElse) thenElse, -- (then stmt,else stmt) whileStmt, -- (expression,stmt) doWhileStmt, -- (expression,stmt) forStmt1, -- (stmt,forStmt2) forStmt2, -- (e3,forStmt3) forStmt3, -- (e1,e2) switchStmt, -- (expression, stmt) breakStmt, -- (-,-) loopStmt, -- (-,-) returnStmt, -- (-,-) string = return value =NIL => none gotoStmt, -- (-,-), string = NAME emptyStmt, -- (-,-) compoundStmt, -- (declaration list,stmtList) expressionStmt, -- (expression,-) defaultLabel, -- (-,-) caseLabel, -- (expression,-) labelLabel, -- (-,-), string = NAME stmtList -- (stmt,stmtList) stmtList=NIL => end of stmtList; stmt can be NIL -- stmt could be a Label also }; DeclaratorType: TYPE = {unknown, simpleName, arrayOf, functionOf, pointerTo}; OperationType: TYPE = { unknown, assignOp, multiplyAssign, divideAssign, modulusAssign, plusAssign, minusAssign, shiftLeftAssign, shiftRightAssign, bitAndAssign, bitOrAssign, bitXorAssign, logicalOr, logicalAnd, bitOr, bitAnd, bitXor, equals, notEquals, lessThan, greaterThan, lessThanOrEqual, greaterThanOrEqual, shiftLeft, shiftRight, plusOp, minusOp, multiplyOp, divideOp, modulusOp, postIncrement, postDecrement, preIncrement, preDecrement, dereference, addressOf, unaryMinus, logicalNot, bitNot, sizeOf, castOp, arrayReference, procedureCall, structReference, nameValue, iconValue, fconValue, stringValue, ifExpression, thenElseExpression, eList}; Class: TYPE = {noClass, auto, static, extern, register, typedef}; MakeNode: PROCEDURE [left, right: LONG POINTER TO TreeNode, string: LONG STRING, nodeType: NodeType] RETURNS [newNode: LONG POINTER TO TreeNode]; -- Frees a tree of nodes (recurses on node.left and node.right) FreeTree: PROCEDURE [node: LONG POINTER TO TreeNode]; }.