Ejemplo n.º 1
0
def forcaseStat():
		global token
		flag = intermediate.newTemp()
		forQuad = intermediate.nextQuad()
		intermediate.genQuad(":=", "0", "_", flag)
		while token[0] != "endforcase":
				if token[0] == "when":
						token = lexi.lex()
						(bTrue, bFalse) = condition()
						intermediate.backPatch(bTrue, intermediate.nextQuad())
						if token[0] == "upDownTk":
								token = lexi.lex()
								statements()
								genQuad(":=", "1", "_", flag)
								intermediate.backPatch(bFalse, intermediate.nextQuad())
						else:
								line = lexi.getLineAndColumn()
								print("Syntax error: expected ':' at line " + str(line[0]+1)+".") 
								exit()
				else:
						line = lexi.getLineAndColumn()
						print("Syntax error: expected 'when' at line " + str(line[0]+1)+".") 
						exit()
								
		intermediate.genQuad("=", flag, "1", forQuad)
		token = lexi.lex()
		return
Ejemplo n.º 2
0
def whileStat():
		global token
		q = intermediate.nextQuad()
		(bTrue, bFalse) = condition()
		intermediate.backPatch(bTrue, intermediate.nextQuad())
		statements()
		intermediate.genQuad("jump","_","_", q)
		intermediate.backPatch(bFalse,nextQuad())
		if token[0] == "endwhile":
				token = lexi.lex()
				return
		else:
				print("Syntax error: 'endwhile' statement is missing. " ) 
				exit()
Ejemplo n.º 3
0
def boolfactor():
		global token
		if token[0] == "not":
				token = lexi.lex()
				if token[0] == "leftlogicparenthesisTk":
						token = lexi.lex()
						(q1True, q1False) = condition()
						if token[0] != "rightlogicparenthesisTk":
								line = lexi.getLineAndColumn()
								print("Syntax error: ']' statement is missing at line " + str(line[0]+1)+".") 
								exit()

						token = lexi.lex()
						return (q1False,q1True)
				else:
						line = lexi.getLineAndColumn()
						print("Syntax error: '[' statement is missing at line " + str(line[0]+1)+".") 
						exit()

		elif token[0] == "leftlogicparenthesisTk":
				token = lexi.lex()
				(q1True, q1False) = condition()
				if token[0] != "rightlogicparenthesisTk":
						line = lexi.getLineAndColumn()
						print("Syntax error: ']' statement is missing at line " + str(line[0]+1)+".") 
						exit()
				token = lexi.lex()
				return (q1True, q1False)
		elif token[0] == "true" or token[0] == "false":
				if token[0] =="true":
						q2True = intermediate.makeList(intermediate.nextQuad())
						q2False = intermediate.emptyList()
						intermediate.genQuad("true", "_", "_", "_")
				else:
						q2False = intermediate.makeList(intermediate.nextQuad())
						q2True = intermediate.emptyList()
						intermediate.genQuad("false", "_", "_", "_")
				token = lexi.lex()
				return (q2True, q2False)
		else:
				expression1 = expression()
				relop = relationalOper()
				expression2 = expression()
				rTrue = makeList(intermediate.nextQuad())
				intermediate.genQuad(relop, expression1, expression2, "_")
				rFalse = makeList(intermediate.nextQuad())
				intermediate.genQuad("jump", "_", "_", "_")
				return (rTrue, rFalse)
Ejemplo n.º 4
0
def repeatStat():
		global token
		global exitList
		global inRepeat
		currentExitList = exitList              #temp list with all the values
		exitList = intermediate.emptyList()                  #clear the global exitList
		inRepeat = True
		bRepeat = intermediate.nextQuad()                    #beginning of repeat
		while token[0] != "endrepeat":
				statements()
		inRepeat = False
		genQuad("jump", "_", "_", bRepeat)      #jump to the start of repeat
		outOfRepeat = intermediate.nextQuad()                #out of the repeat
		backPatch(exitList, outOfRepeat)        #backPatch the current out of repeat
		exitList = currentExitList              #give back to global list
		token = lexi.lex()
		return
Ejemplo n.º 5
0
def condition():
		global token
		(q1True, q1False) = boolterm()
		bTrue = q1True
		bFalse = q1False
		while token[0] == "or":
				token = lexi.lex()
				intermediate.backPatch(bFalse, intermediate.nextQuad())
				(q2True, q2False) = boolterm()
				bTrue = intermediate.merge(bTrue, q2True)
				bFalse = q2False
		return (bTrue, bFalse)
Ejemplo n.º 6
0
def switchStat():
		global token
		exitList = intermediate.emptyList()
		e1 = expression()
		while token[0] != "endswitch": 
				if token[0] == "case":
						token = lexi.lex()
						e2 = expression()
						if token[0] == "upDownTk":

								bTrue = intermediate.makeList(intermediate.nextQuad())    #references ["=", e1, e2, "_"]
								intermediate.genQuad("=", e1, e2, "_")
								bFalse = intermediate.makeList(intermediate.nextQuad())   #references ["jump", "_", "_", "_"]
								intermediate.genQuad("jump", "_", "_", "_")
								intermediate.backPatch(bTrue, intermediate.nextQuad())    # ["=", e1, e2, tells where to go]

								token = lexi.lex()
								statements()

								tList = intermediate.makeList(intermediate.nextQuad())
								intermediate.genQuad("jump", "_", "_", "_")
								exitList = intermediate.merge(exitList, tList)
								intermediate.backPatch(bFalse, intermediate.nextQuad())
						else:
								line = getLineAndColumn()
								print("Syntax error: expected ':' at line " + str(line[0]+1)+".") 
								exit()
				else:
						line = lexi.getLineAndColumn()
						print("Syntax error: 'endswitch' or 'case' statement is missing .") 
						exit()

		intermediate.backPatch(exitList, intermediate.nextQuad())
		token = lexi.lex()
		return
Ejemplo n.º 7
0
def ifStat():   
		global token
		(bTrue, bFalse) = condition()
		if token[0] == "then":
				
				intermediate.backPatch(bTrue, intermediate.nextQuad())
				token = lexi.lex()
				statements()
				ifList = intermediate.makeList(intermediate.nextQuad())
				intermediate.genQuad("jump","_","_","_")
				intermediate.backPatch(bFalse, intermediate.nextQuad())
				elsepart()
				intermediate.backPatch(ifList, intermediate.nextQuad())
				if token[0] == "endif":
						token = lexi.lex()
						return
				else:
						print("Syntax error: 'endif' statement is missing.") 
						exit()
		else:
				line = lexi.getLineAndColumn()
				print("Syntax error: 'then' statement is missing at line " + str(line[0]+1)+".") 
				exit()