Esempio n. 1
0
class Syntax():
	def __init__(self,lexicalAnalysis):
		self.Lexical = lexicalAnalysis
		self.SymbolTable = SymbolTable()
		self.FirstPass = None
		self.Next = False

	def run(self,firstPass =True):
		if(firstPass):	
			self.Lexical.Run()
		else:
			print "reset"
			self.Lexical.reset();
		self.FirstPass = firstPass
		self.Compilation_Unit()
	def HandleException(self, exception):
		traceback.print_exc()
		print str(exception)
		os._exit(0)
	def expression(self):
		if(self.Lexical.getToken().lexem == "("):
			try:
				self.Lexical.GetNextToken()
				self.expression()
			except Exception as e:
				raise e
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ")"):
				raise Exception(TossError(self,")"))
			self.Lexical.GetNextToken()
			try:
				self.expressionz()
			except Exception as e:
				self.HandleException(e)
		elif(self.Lexical.getToken().lexem == "true" or self.Lexical.getToken().lexem == "false" or self.Lexical.getToken().lexem == "null" or self.Lexical.getToken().myType == "number" or self.Lexical.getToken().myType == "char" ):
			try:
				self.Lexical.GetNextToken()
				ret = self.expressionz()
			except Exception as e:
				self.HandleException(e)
	
		elif(self.Lexical.getToken().myType  == "Identifier"):
			try:
				self.Lexical.GetNextToken()
				ret = self.fn_arr_member()
				if (ret != None):
					self.Lexical.GetNextToken()
				ret = self.member_refz()
				if (ret != None):
					self.Lexical.GetNextToken()
				ret = self.expressionz()
			except Exception as e:
				self.HandleException(e)
		else:
			raise Exception()
	def expressionz(self):
		token = self.Lexical.getToken()
		if(token.lexem == '='):
			self.Lexical.GetNextToken()
			self.assignment_expression()
		elif(token.lexem == "&&" or token.lexem == '||'):
			self.Lexical.GetNextToken()
			self.expression()
		elif(token.lexem == "==" or token.lexem == "!=" or token.lexem == '<=' or token.lexem == '>=' or token.lexem == '<' or token.lexem == '>'):
			self.Lexical.GetNextToken()
			print "EJG"+ self.Lexical.getToken().lexem
			self.expression()
		elif(token.myType == 'math'):
			self.Lexical.GetNextToken()
			self.expression()
		return 1 
	def fn_arr_member(self):
		if(self.Lexical.getToken().lexem == "("):
			self.Lexical.GetNextToken()
			try:
				self.argument_list()
			except Exception as e:
				if e.msg != "NoneExistant":
					self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ")"):
				raise Exception(TossError(self,")"));
			return 1
		elif( self.Lexical.getToken().lexem == "["):
			
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "]"):
				raise Exception(TossError(self,"]"))
			return 1
		else:
			return None
	
	def member_refz(self):
		if(self.Lexical.getToken().lexem != "."):
			return
		self.Lexical.GetNextToken()
		if(self.Lexical.getToken().myType != "Identifier"):
			raise Exception(TossError(self,"Identifier"))
		try:
			self.Lexical.GetNextToken()
			ret = self.fn_arr_member()
			if( ret != None):
				self.Lexical.GetNextToken()
			ret = self.member_refz()
			if(ret != None):
				self.Lexical.GetNextToken()
		except Exception as e:
			self.HandleException(e)
		return 1
	def assignment_expression(self):
		if self.Lexical.getToken().lexem == 'this':
			self.Lexical.GetNextToken()
			return
		elif self.Lexical.getToken().lexem == 'new':
			self.Lexical.GetNextToken()
			try:
				self.isType()
				self.Lexical.GetNextToken()
				self.new_declaration()
			except Exception as e:
				self.HandleException(e)
		elif self.Lexical.getToken().lexem == 'atoi':
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != '('):
				self.HandleException(TossError(self,'('))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ')'):
				self.HandleException(TossError(self,')'))
		elif(self.Lexical.getToken().lexem == 'itoa'):
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != '('):
				self.HandleException(TossError(self,'('))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ')'):
				self.HandleException(TossError(self,')'))
		else:

			try: 
				self.expression()
			except Exception as e:
				raise e			

			
	def ClassNameExists(self):
		return self.SymbolTable.Exists(self.Lexical.getToken().lexem)	
	def new_declaration(self):
		if(self.Lexical.getToken().lexem == "("):
			self.Lexical.GetNextToken()
			try:
				self.argument_list()
			except Exception as e:
				self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ")"):
				raise Exception(TossError(self,")"))
		if(self.Lexical.getToken().lexem == "["):
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				 self.HandleException(e)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "]"):
				raise Exception(TossError(self,"]"))
	def argument_list(self):
		try:
			self.expression()
		except Exception as e:
			raise e
		while(self.Lexical.Peek.lexem != ","):
		
			self.Lexical.GetNextToken()
			try:
				self.Lexical.GetNextToken()
				self.expression()
			except Exception as e:
				raise Exception(TossError(self,"Exception"))

	def Compilation_Unit(self):
		ret = -1
		while ret != 0:
			try:
				ret =self.Class_declaration()
			except Exception as e:
				self.HandleException(e)
		print "Here"
		if( self.Lexical.getToken().lexem != "void"):
			raise Exception(TossError(self,"void"))
		else:
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem == "main"):
				if(not self.SymbolTable.Exists("main")):
					symid = self.SymbolTable.getSymID("method")
					self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symid,"main","method",{"Return Type":"void"}))
				self.SymbolTable.startScope("main")
				self.Lexical.GetNextToken()
				if(self.Lexical.getToken().lexem != "("):
					raise Exception(TossError(self, '('))
				else: 
					self.Lexical.GetNextToken()
					if self.Lexical.getToken().lexem != ')':
						raise Exception(TossError(self,')'))
					else:
						self.Lexical.GetNextToken()
						try:
							self.method_body()
						except Exception as e:
							self.HandleException(e)
					self.SymbolTable.endScope()
			else:
				raise Exception(TossError(self,"Main"))
			

	def Class_declaration(self):
		if(self.Lexical.getToken().lexem != "class"):
			return 0
		try:
			self.Lexical.GetNextToken()
			ret =self.class_name()
			if(ret == 0):
				raise Exception(TossError(self,"ClassName"))
			self.SymbolTable.startScope(self.Lexical.getToken().lexem)
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "{"):
				raise Exception(TossError(self,"{"))
			
		except Exception as e:
			self.HandleException(e)
		self.Lexical.GetNextToken()
		count =0
		while(True):
			try:
				self.class_member_declaration()
				if(self.Lexical.getToken().lexem == "}"and self.Lexical.Peek().lexem == "void"):
					break
				self.Lexical.GetNextToken()
			except Exception as e:
				break
		if(self.Lexical.getToken().lexem != "}"):
			raise Exception(TossError(self,"}"))
		else:
			self.Lexical.GetNextToken()
		self.SymbolTable.endScope()

	def class_name(self):
		if(self.Lexical.getToken().myType != "Identifier"):
			return 0
		if(self.FirstPass):
			if (self.SymbolTable.Exists(self.Lexical.getToken().lexem)):
				return 1
			else:
				
				symId = self.SymbolTable.getSymID("Class")
				node = self.Lexical.getToken() 
				self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symId,node.lexem,"Class",None))
				return 1
		else:
			if (self.SymbolTable.Exists(self.Lexical.getToken().lexem)):
				return 1
			else:
				return 0



	def class_member_declaration(self):
		try:
			self.isModifier()
		except:
			try:
				self.constructor_declaration()
				return
			except Exception as e:
				raise Exception()
		modifier = self.Lexical.getToken().lexem
		self.Lexical.GetNextToken()
		method = False
		try:
			myType =self.isType()
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().myType != 'Identifier'):
				raise Exception(TossError(self,'Identifier'))
			if(not self.SymbolTable.Exists(self.Lexical.getToken().lexem)):
				if(self.Lexical.Peek().lexem != "("):
					symId = self.SymbolTable.getSymID("Variable")
					node = self.Lexical.getToken()
					self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symId,node.lexem,"ivar", {"Type":myType, "modifier":modifier}))
				else:
					symId = self.SymbolTable.getSymID("method")
					method = True
					node = self.Lexical.getToken()
					self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symId,node.lexem,"method", {"return Type":myType, "modifier":modifier}))
					self.SymbolTable.startScope(node.lexem)

			self.Lexical.GetNextToken()
			self.field_declaration()
			if(method):
				self.SymbolTable.endScope()
		except Exception as e:
			self.HandleException(e)
	def isType(self):
		token  = self.Lexical.getToken()
		if(self.FirstPass):
			if token.myType == 'type':				
				return token.lexem
			else:
				ret = self.ClassNameExists()
				if(ret == 0):
					raise Exception("TESTING")
				else:
					pass
				return None
		else:
			if token.myType == 'type':
				return token.lexem
			else:
					ret = self.ClassNameExists()
					if ret == 0 :
						raise Exception(TossError(self,"Type"))
	def  ClassNameExists(self):
		if(self.FirstPass):
			return 1
		else:
			if( self.SymbolTable.ClassExists(self.Lexical.getToken().lexem)):
				return 1
			else:
				return 0
			
	def isModifier(self):
		token = self.Lexical.getToken()
		print token.lexem
		if( token.lexem == "public"):
			return
		elif(token.lexem == 'private'):
			return
		else:
			raise Exception()
	def field_declaration(self):
		token = self.Lexical.getToken()
		if(token.lexem == '('):
			self.Lexical.GetNextToken()
			if(self.parameter_list()):
				self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem !=  ')'):
				raise Exception(TossError(self,')'))
			try:
				self.Lexical.GetNextToken()
				self.method_body()
			except Exception as e:
				self.HandleException(e)
			


		else:
			if token.lexem == '[':
				self.Lexical.GetNextToken()
				if(self.Lexical.getToken().lexem != ']'):
					raise Exception(TossError(self,']'))
				self.Lexical.GetNextToken()
			elif(token.lexem == '='):
				try:
					self.Lexical.GetNextToken()
					self.assignment_expression()
					self.Lexical.GetNextToken()
				except Exception as e:
					self.HandleException(e)
			if(self.Lexical.getToken().lexem != ';'):
				raise Exception(TossError(self,';'))
	def constructor_declaration(self):
		try:
			ret = self.SymbolTable.ClassExists(self.Lexical.getToken().lexem)
			if(not ret):
				raise Exception()
			if(not self.FirstPass):	
				symId = self.SymbolTable.getSymID("method")
				token = self.Lexical.getToken()
				try:
					node = SymbolNode(self.SymbolTable.getScope(),symId,token.lexem,"method",None)
					self.SymbolTable.addNode(node)
				except Exception as e:
					print str(e)
			self.SymbolTable.startScope(self.Lexical.getToken().lexem)
			self.Lexical.GetNextToken()
			
			
			if(self.Lexical.getToken().lexem != '('):
				raise Exception(TossError(self,'('))
			self.Lexical.GetNextToken()
			if(self.parameter_list() ):
				self.Lexical.GetNextToken()
			if (self.Lexical.getToken().lexem != ')'):
				raise Exception(TossError(self,')'))
			self.Lexical.GetNextToken()
			self.method_body()
			print self.Lexical.getToken().lexem
			self.SymbolTable.endScope()
		except Exception as e:
			raise e

		
	def method_body(self):
		if(self.Lexical.getToken().lexem != '{'):
			raise Exception(TossError(self,'{'))
		self.Lexical.GetNextToken()
		if(self.Lexical.getToken().lexem == "}"):
			return
		while(True):
			try:
				self.variable_declaration()
				self.Lexical.GetNextToken()
			except Exception as e:
				break
		while(True):
			try:
				self.statement()
				print "self = %s" % self.Lexical.getToken()
				self.Lexical.GetNextToken()
				print "self2 = %s" % self.Lexical.getToken()
			except:
				print "self3 = %s" % self.Lexical.getToken()
				break
		
		if(self.Lexical.getToken().lexem != '}'):
			raise Exception(TossError(self,'}'))
		
	def variable_declaration(self):
		try:
			mytype = self.isType()
		except Exception as e:
			raise e
		if(self.Lexical.Peek().myType != 'Identifier'):
			raise self.handleException(Exception(TossError(self,'Identifier')))
		self.Lexical.GetNextToken()
		if(self.Lexical.getToken().myType != 'Identifier'):
			self.handleException(Exception(TossError(self,'Identifier')))
		if( not self.SymbolTable.Exists(self.Lexical.getToken().lexem)):
			symid = self.SymbolTable.getSymID("local")
			self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symid,self.Lexical.getToken().lexem,"lvar",{"type":mytype}))
		self.Lexical.GetNextToken()
		if(self.Lexical.getToken().lexem == '['):
				self.Lexical.GetNextToken()
				if(self.Lexical.getToken().lexem != ']'):
						self.HandleException(Exception(TossError(self,']')))
				self.Lexical.GetNextToken()
		if(self.Lexical.getToken().lexem == '='):
			
			self.Lexical.GetNextToken()
			try:
				self.assignment_expression()
			except Exception as e:
				self.HandleException(e)
		if(self.Lexical.getToken().lexem != ';'):
			self.HandleException(Exception(TossError(self,';')))
	def statement(self):
		if(self.Next ):
		
			print self.Lexical.getToken().lexem
		if(self.Lexical.getToken().lexem == "{"):
			self.Lexical.GetNextToken()
			try:
				self.statement()
			except Exception as e:
				raise e
			self.Lexical.GetNextToken()
			if self.Lexical.getToken().lexem != "}":
				raise Exception(TossError(self,"}"))
		elif(self.Lexical.getToken().lexem == "if"):
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "("):
				raise Exception(TossError(self,"("))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				raise e
			if self.Lexical.getToken().lexem != ")":
				raise Exception(TossError(self,")"))
			try:
				self.Lexical.GetNextToken()
				self.statement()
			except Exception as e:
				raise e
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem == "else"):
				try:
					self.Lexical.GetNextToken()
					self.statement()
					
				except Exception as e:
					raise e	
			return
		elif(self.Lexical.getToken().lexem  == "while"):
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "("):
				raise Exception(TossError(self,"("))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				raise e
			if(self.Lexical.getToken().lexem != ")"):
				raise Exception(TossError(self,")"))
			self.Lexical.GetNextToken()
			try:
				self.statement()
			except Exception as e:
				raise e
		elif (self.Lexical.getToken().lexem == "return"):
			self.Lexical.GetNextToken()
			try:
			    self.expression()
			except Exception as e:
				raise e
			if(self.Lexical.getToken().lexem != ";"):
				raise Exception(TossError(self,";"))
		elif (self.Lexical.getToken().lexem == "cout"):
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != "<<"):
				raise Exception(TossError(self,"<<"))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				raise e
			if(self.Lexical.getToken().lexem != ";"):
				raise Exception(TossError(self,";"))
		elif self.Lexical.getToken().lexem == "cin":
			self.Lexical.GetNextToken()
			if(self.Lexical.getToken().lexem != ">>"):
				raise Exception(TossError(self,">>"))
			self.Lexical.GetNextToken()
			try:
				self.expression()
			except Exception as e:
				raise e
		else:
			print 'Here'
			try:
				print "selfExpre = %s" % self.Lexical.getToken()
				ret =self.expression()
				print "sele:w1 = %s" % self.Lexical.getToken()
				if(self.Lexical.Peek().lexem == "sum"):
					print "h123:ere"
					self.Next = True
			except Exception as e:
				print "Raising"
				raise e
			
				
	def parameter_list(self):
		if(self.Lexical.getToken().lexem == ")"):
			return False
		while(True):
			try:
				self.parameter()
				self.Lexical.GetNextToken()
				if(self.Lexical.getToken().lexem != ","):
					break
				self.Lexical.GetNextToken()
			except Exception as e:
				self.HandleException(e)
		return False
	def parameter(self):
		try:
			myType = self.isType()
		except:
			raise Exception(TossError(self,"Type"))
		self.Lexical.GetNextToken()

		if(self.Lexical.getToken().myType != "Identifier" ):
			raise Exception(TossError(self,"Identifier"))
		if(not self.SymbolTable.Exists(self.Lexical.getToken().lexem)):
			symid = self.SymbolTable.getSymID("parameter")
			node = self.Lexical.getToken()
			self.SymbolTable.addNode(SymbolNode(self.SymbolTable.getScope(),symid,node.lexem,"parameter",{"type": myType}))
	def printTable(self):
		print self.SymbolTable.getScope()
		print self.SymbolTable