Merge branch 'master' of https://git.etud.insa-toulouse.fr/rlacroix/Projet-Systemes-Informatiques
This commit is contained in:
commit
ce3fda3a4e
2 changed files with 89 additions and 37 deletions
122
post-process.py
122
post-process.py
|
@ -1,3 +1,5 @@
|
|||
import re
|
||||
|
||||
opToBinOP = {
|
||||
"ADD": 1,
|
||||
"MUL": 2,
|
||||
|
@ -16,80 +18,130 @@ opToBinOP = {
|
|||
"NOT": 15
|
||||
}
|
||||
|
||||
|
||||
def output(s):
|
||||
fileOutput = open('asm2', 'w')
|
||||
fileOutput.write("\n".join(s))
|
||||
fileOutput.close()
|
||||
|
||||
|
||||
def convertToRegister(s):
|
||||
# TODO check if there is a /\d_label/ in s[0] and if so adds it back at the start of the output
|
||||
l = []
|
||||
|
||||
if not re.match(r"\d_LABEL .*", s[0]) :
|
||||
optionalFlag = ""
|
||||
incr = 0
|
||||
else:
|
||||
optionalFlag = s[0] + " "
|
||||
incr = 1
|
||||
|
||||
match s[0]:
|
||||
case "ADD":
|
||||
l.append("LOAD R0 "+s[2])
|
||||
l.append("LOAD R1 "+s[3])
|
||||
l.append(optionalFlag+"LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("ADD R0 R0 R1")
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "MUL":
|
||||
l.append("LOAD R0 "+s[2])
|
||||
l.append("LOAD R1 "+s[3])
|
||||
l.append(optionalFlag+"LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("MUL R0 R0 R1")
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "SUB":
|
||||
l.append("LOAD R0 "+s[2])
|
||||
l.append("LOAD R1 "+s[3])
|
||||
l.append(optionalFlag+"LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("SUB R0 R0 R1")
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "DIV_INT":
|
||||
l.append("LOAD R0 "+s[2])
|
||||
l.append("LOAD R1 "+s[3])
|
||||
l.append(optionalFlag+"LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("DIV R0 R0 R1")
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "COP":
|
||||
l.append("LOAD R0 "+s[2])
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append(optionalFlag+"LOAD R0 "+s[2+incr])
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "AFC":
|
||||
l.append("AFC R0 "+s[2])
|
||||
l.append("STORE "+s[1]+" R0")
|
||||
l.append(optionalFlag+"AFC R0 "+s[2+incr])
|
||||
l.append("STORE "+s[1+incr]+" R0")
|
||||
case "JMP":
|
||||
pass
|
||||
case "JMF":
|
||||
pass
|
||||
case "INF":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R1 "+s[3+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("INF R2 R0 R1")
|
||||
case "SUP":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R1 "+s[3+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("SUP R2 R1 R0")
|
||||
case "EQ":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R1 "+s[3+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("EQ R2 R1 R0")
|
||||
case "PRI":
|
||||
l.append("PRI "+s[2+inc])
|
||||
l.append("PRI "+s[2+incr])
|
||||
case "AND":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R1 "+s[3+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("AND R2 R0 R1")
|
||||
case "OR":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R1 "+s[3+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("LOAD R1 "+s[3+incr])
|
||||
l.append("OR R2 R0 R1")
|
||||
case "NOT":
|
||||
l.append("LOAD R0 "+s[2+inc])
|
||||
l.append("LOAD R0 "+s[2+incr])
|
||||
l.append("NOT R2 R0")
|
||||
''' R2 contiendra la valeur qui dit s'il faut sauter ou non'''
|
||||
|
||||
|
||||
""" R2 contiendra la valeur qui dit s'il faut sauter ou non """
|
||||
|
||||
return l
|
||||
|
||||
|
||||
totalLine = 0 # TODO Check the number of line is never reached
|
||||
labelCount = 0 # used to create a new label each time
|
||||
|
||||
fileInput = open("asm", "r")
|
||||
ASMLines = list(map(lambda e: e.rstrip("\n"), fileInput.readlines()))
|
||||
print(ASMLines)
|
||||
finalCode = []
|
||||
fileInput.close()
|
||||
|
||||
ASMLinesLabel = ASMLines[:] # will contain at the end of the first loop the code with labels inserted
|
||||
ASMLinesRegister = [] # will contain at the end of the 2nd loop the registry-based code with labels
|
||||
ASMLinesFinal = [] # will contain the output, register-based, code
|
||||
for i, l in enumerate(ASMLines):
|
||||
items = l.split(" ")
|
||||
finalCode.extend(convertToRegister(items))
|
||||
# idée pour les jumps : quand on voit un jump à la ligne tant on peut ajouter un label là-bas
|
||||
if items[0] in ["JMP", "JMF"]:
|
||||
lineToJumpTo = int(items[
|
||||
1 if items[0] == "JMP" else 2
|
||||
])
|
||||
if re.match(r"\d_LABEL .*", ASMLinesLabel[lineToJumpTo]):
|
||||
ASMLinesLabel[i] = " ".join(ASMLines[i].split()[:-1] + [ASMLinesLabel[lineToJumpTo].split()[0]])
|
||||
else:
|
||||
ASMLinesLabel[lineToJumpTo] = f"{labelCount}_LABEL " + ASMLines[lineToJumpTo]
|
||||
ASMLinesLabel[i] = " ".join(ASMLinesLabel[i].split()[:-1] + [f"{labelCount}_LABEL"])
|
||||
labelCount += 1
|
||||
print(ASMLinesLabel)
|
||||
|
||||
for i, l in enumerate(ASMLinesLabel):
|
||||
ASMLinesRegister.extend(convertToRegister(l.split()))
|
||||
print(ASMLinesRegister)
|
||||
|
||||
labels = {}
|
||||
for i, l in enumerate(ASMLinesRegister):
|
||||
if re.match(r"\d_LABEL .*", l):
|
||||
labels[l.split()[0]] = i
|
||||
ASMLinesRegister[i] = " ".join(ASMLinesRegister[i].split()[1:])
|
||||
print(ASMLinesRegister)
|
||||
|
||||
for i, l in enumerate(ASMLinesRegister):
|
||||
label = re.match(r"\d_LABEL", l.split()[-1])
|
||||
if label:
|
||||
ASMLinesFinal.append(" ".join(l.split()[:-1] + [str(labels[label[0]])]))
|
||||
else :
|
||||
ASMLinesFinal.append(l)
|
||||
|
||||
|
||||
print(ASMLinesRegister)
|
||||
output(ASMLinesFinal)
|
||||
# - trucs en registre
|
||||
# - décaler les Jumps
|
||||
# - COP -> OPCode
|
||||
|
|
4
yacc.y
4
yacc.y
|
@ -112,7 +112,7 @@ Operation: tADD | tMUL | tSUB | tDIV;
|
|||
*/
|
||||
|
||||
IfStatement1 : %empty {
|
||||
int ligne =getCurrentLineNumber(); addLine("JMPF"); $<nbInt>$ = ligne ;
|
||||
int ligne =getCurrentLineNumber(); addLine("JMF"); $<nbInt>$ = ligne ;
|
||||
};
|
||||
|
||||
IfStatement : tIF Condition IfStatement1 InnerBlock tELSE {
|
||||
|
@ -128,7 +128,7 @@ WhileStatement : tWHILE {
|
|||
$1 = getCurrentLineNumber();
|
||||
} Condition {
|
||||
int current = getCurrentLineNumber();
|
||||
addLine("JMPF");
|
||||
addLine("JMF");
|
||||
setConditionAddr(current,$3);
|
||||
whileJumpAddr = current;
|
||||
suppressCONDElements();
|
||||
|
|
Loading…
Reference in a new issue