Exemple #1
0
	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 )
Exemple #2
0
	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." )