def _ifStatement( self, parent, symbolTable, parentClosures=[] ) : closure = SymbolTable() parentSym = Symbol( self._reserved.PARENT_SYMBOL_TABLE, self._reserved.PARENT_SYMBOL_NAME, symbolTable ) closure.AddSymbol( parentSym ) ifsym = Symbol( self._reserved.IF_STATEMENT, "if_%d" % (self._closureCount), closure ) self._symTable.AddSymbol( ifsym ) self._closureCount += 1 node = ParseNode( self._reserved.IF_STATEMENT, ifsym.Name ) parent.AddChild( node ) # add to list of parent closures parentClosures.append( symbolTable ) # IF self._eat( self._reserved.IF, "If statement expected." ) # Condition self._condition( node, symbolTable ) # THEN self._eat( self._reserved.THEN, "'Then' statement expected." ) # { self._eat( self._reserved.LCURLY, "Left curly brace expected in if statement." ) # STATEMENT statementNode = ParseNode( self._reserved.STATEMENT, None ) node.AddChild( statementNode ) self._statement( statementNode, closure, parentClosures ) # add to conditional # } self._eat( self._reserved.RCURLY, "Right curly brace expected in if" ) nexttoken = self._lexedSrc[self._curPos] if nexttoken[0] == self._reserved.ELSE : # ELSE self._eat( self._reserved.ELSE, "Expected else statement" ) # { self._eat( self._reserved.LCURLY, "Expected left curly brace in else statement" ) # STATEMENT statementNode = ParseNode( self._reserved.ELSE, None ) node.AddChild( statementNode ) closure = SymbolTable() parentSym = Symbol( self._reserved.PARENT_SYMBOL_TABLE, self._reserved.PARENT_SYMBOL_NAME, symbolTable ) closure.AddSymbol( parentSym ) elsesym = Symbol( self._reserved.ELSE, "else_%d" % (self._closureCount), closure ) statementNode.TokenValue = elsesym.Name self._symTable.AddSymbol( elsesym ) self._closureCount += 1 self._statement( statementNode, closure, parentClosures ) # add to conditional # } self._eat( self._reserved.RCURLY, "Expected right curly brace in else statement" ) # remove the symbol table from the list of parents! parentClosures.pop( len(parentClosures)-1 )
def _procedureList( self, parent, symbolTable ) : #node = ParseNode( self._reserved.PARAMETER, None ) # ) right away nexttoken = self._lexedSrc[self._curPos] if nexttoken[0] == self._reserved.RPAREN : self._eat( self._reserved.RPAREN, "Expected right parenthisis after parameter list in procedure declaration" ) return; node = ParseNode( self._reserved.PARAMETER, "" ) parent.AddChild( node ) # NUM or STRING nexttoken = self._lexedSrc[self._curPos] ndtype = None if nexttoken[0] == self._reserved.NUM : node.AddChild( ParseNode( (self._eat(self._reserved.NUM, "Expected NUM statement in parameter list."))[0], None ) ) ndtype = self._reserved.NUM elif nexttoken[0] == self._reserved.STRING : node.AddChild( ParseNode( (self._eat(self._reserved.STRING, "Expected STRING statement in parameter list."))[0], None ) ) ndtype = self._reserved.STRING # * isRef = False nexttoken = self._lexedSrc[self._curPos] if nexttoken[0] == self._reserved.MULTIPLY : isRef = True #node.AddChild( ParseNode( self._reserved.REF, None ) ) self._eat( self._reserved.MULTIPLY, "Expected reference before parameter name." ) # VARIABLE NAME vnode = self._variableName( node ) symbolTable.AddSymbol( Symbol( ndtype, vnode.TokenValue, None, True, isRef ) ) #symbolTable.AddSymbol( Symbol( self._reserved.PARAMETER, vnode.TokenValue, ndtype ) ) node.TokenValue = vnode.TokenValue # , or ) nexttoken = self._lexedSrc[self._curPos] if nexttoken[0] == self._reserved.COMMA : self._eat( self._reserved.COMMA, "Expected comma after parameter in declaration statement" ) self._procedureList( parent, symbolTable ) elif nexttoken[0] == self._reserved.RPAREN : self._eat( self._reserved.RPAREN, "Expected right parenthisis in procedure statement." )