Skip to content
Merged

V2.2 #21

Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
not working
  • Loading branch information
lucafs committed May 11, 2021
commit f74dd012ab9eb2ae943a7bbab12e9dc86609c06e
249 changes: 194 additions & 55 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,23 @@ def tToken_finder(char):
return "OPN"
elif(char == ")"):
return "CLS"
elif(char == "{"):
return "OPN_COM"
elif(char == "}"):
return "CLS_COM"
elif(char == "="):
return "EQL"
elif(char == ";"):
return "ENDCOM"
#Temporario
elif(char == "-" or char == "_"):
return "IDENT"
#Aqui
elif(char.isalpha()):
elif(char == ">"):
return "GREATER"
elif(char == "<"):
return "LESS"
elif(char == "&"):
return "AND"
elif(char == "│"):
return "OR"
elif(char.isalpha() or char == "-" or char == "_"):
return "IDENT"
elif(char.isdigit()):
return "NUM"
Expand Down Expand Up @@ -94,6 +102,38 @@ class ReadLn(Node):
def Evaluate(self, st):
return int(input())

class LogOp(Node):

def Evaluate(self, st):
if self.value == "<":
return self.children[0].Evaluate(st) < self.children[1].Evaluate(st)
elif self.value == ">":
return self.children[0].Evaluate(st) > self.children[1].Evaluate(st)
elif self.value == "==":
return self.children[0].Evaluate(st) == self.children[1].Evaluate(st)
elif self.value == "&&":
return self.children[0].Evaluate(st) or self.children[1].Evaluate(st)
elif self.value == "││":
return self.children[0].Evaluate(st) and self.children[1].Evaluate(st)


class WhileOp(Node):

def Evaluate(self, st):
while (self.children[0].Evaluate(st)):
self.children[1].Evaluate(st)


class IfOp(Node):

def Evaluate(self, st):
if (self.children[0].Evaluate(st)):
self.children[1].Evaluate(st)
else:
if len(self.children) > 2:
self.children[2].Evaluate(st)



class Comandos(Node):
def Evaluate(self, ST):
Expand All @@ -102,6 +142,12 @@ def Evaluate(self, ST):









class Token:
def __init__(self, tToken = None, value = None):
self.type = tToken
Expand Down Expand Up @@ -144,8 +190,6 @@ def selectNext(self):
self.position += 1
if(self.position == len(self.origin)):
break


if((self.position < len(self.origin)) and self.actual.type == "IDENT"):
while(tToken_finder(self.origin[self.position]) == "IDENT" or tToken_finder(self.origin[self.position]) == "NUM"):
self.actual.value += self.origin[self.position]
Expand All @@ -159,11 +203,34 @@ def selectNext(self):
self.position += 1
if(self.position == len(self.origin)):
break
if((self.position < len(self.origin)) and self.actual.type == "EQL"):
if(tToken_finder(self.origin[self.position]) == "EQL"):
self.actual.value += self.origin[self.position]
self.actual.type = "DUALEQL"
self.position +=1

if(self.actual.type == "OR"):
if(tToken_finder(self.origin[self.position]) != "OR"):
raise Exception("OR INCOMPLETE")
self.position +=1
self.actual.value += self.origin[self.position]

if(self.actual.type == "AND"):
if(tToken_finder(self.origin[self.position]) != "AND"):
raise Exception("AND INCOMPLETE")
self.position +=1
self.actual.value += self.origin[self.position]



if(self.actual.value == "println"):
self.actual.type = "PRINT"
elif(self.actual.value == "readln"):
self.actual.type = "READ"
elif(self.actual.value == "if"):
self.actual.type = "IF"
elif(self.actual.value == "while"):
self.actual.type = "WHILE"
return self.actual


Expand All @@ -173,6 +240,89 @@ class Parser():
def __init__(self):
self.tokens = Tokenizer

@staticmethod
def parseOrexPR():
res = Parser.parseAndexPR()
while(Parser.tokens.actual.type == "OR"):
node = LogOp("││",[])
node.children.append(res)
node.children.append(Parser.parseAndexPR())
res = node

return res

@staticmethod
def parseAndexPR():
res = Parser.parseEqePR()
while(Parser.tokens.actual.type == "AND"):
node = LogOp("&&",[])
node.children.append(res)
node.children.append(Parser.parseEqePR())
res = node

return res

@staticmethod
def parseEqePR():
res = Parser.parseRelexPR()
while(Parser.tokens.actual.type == "DUALEQL"):
node = LogOp("==",[])
node.children.append(res)
node.children.append(Parser.parseRelexPR())
res = node

return res


@staticmethod
def parseRelexPR():
res = Parser.parseExpression()
while(Parser.tokens.actual.type == "GREATER" or Parser.tokens.actual.type == "LESS"):
if(Parser.tokens.actual.type == "GREATER"):
node = LogOp(">",[])
node.children.append(res)
node.children.append(Parser.parseExpression())
elif(Parser.tokens.actual.type == "LESS"):
node = LogOp("<",[])
node.children.append(res)
node.children.append(Parser.parseExpression())
res = node

return res

@staticmethod
def parseExpression():
res = Parser.parseTerm()
while(Parser.tokens.actual.type == "SUM" or Parser.tokens.actual.type == "MIN"):
if (Parser.tokens.actual.type == "SUM"):
node = BinOP("+",[])
node.children.append(res)
node.children.append(Parser.parseTerm())

elif (Parser.tokens.actual.type == "MIN"):
node = BinOP("-",[])
node.children.append(res)
node.children.append(Parser.parseTerm())
res = node
return res

@staticmethod
def parseTerm():
res = Parser.parseFactor()
while(Parser.tokens.actual.type == "MUT" or Parser.tokens.actual.type == "DIV"):
if(Parser.tokens.actual.type == "MUT"):
node = BinOP("*",[])
node.children.append(res)
node.children.append(Parser.parseFactor())

elif(Parser.tokens.actual.type == "DIV"):
node = BinOP("/",[])
node.children.append(res)
node.children.append(Parser.parseFactor())
res = node

return res

@staticmethod
def parseFactor():
Parser.tokens.selectNext()
Expand All @@ -182,7 +332,7 @@ def parseFactor():
node = IntVal(res)
Parser.tokens.selectNext()
return node
if(Parser.tokens.actual.type== "IDENT"):
elif(Parser.tokens.actual.type== "IDENT"):
node = Identifier()
node.value= Parser.tokens.actual.value
Parser.tokens.selectNext()
Expand All @@ -197,7 +347,7 @@ def parseFactor():
node.children.append(Parser.parseFactor())
return node
elif(Parser.tokens.actual.type == "OPN"):
res = Parser.parseExpression()
res = Parser.parseOrexPR()
if(Parser.tokens.actual.type != "CLS"):
raise Exception ("Parenteses não fechados")
Parser.tokens.selectNext()
Expand All @@ -213,60 +363,31 @@ def parseFactor():
raise Exception("Read error")
else:
raise Exception("Read error")
return node

return node
else:
raise Exception ("Factor error")


@staticmethod
def parseExpression():
res = Parser.parseTerm()
while(Parser.tokens.actual.type == "SUM" or Parser.tokens.actual.type == "MIN"):
if (Parser.tokens.actual.type == "SUM"):
node = BinOP("+",[])
node.children.append(res)
node.children.append(Parser.parseTerm())

elif (Parser.tokens.actual.type == "MIN"):
node = BinOP("-",[])
node.children.append(res)
node.children.append(Parser.parseTerm())
res = node
return res

@staticmethod
def parseTerm():
res = Parser.parseFactor()
while(Parser.tokens.actual.type == "MUT" or Parser.tokens.actual.type == "DIV"):
if(Parser.tokens.actual.type == "MUT"):
node = BinOP("*",[])
node.children.append(res)
node.children.append(Parser.parseFactor())

elif(Parser.tokens.actual.type == "DIV"):
node = BinOP("/",[])
node.children.append(res)
node.children.append(Parser.parseFactor())
res = node

return res

@staticmethod
def parseBlock():
Parser.tokens.selectNext()
if Parser.tokens.actual.type == "IDENT" or Parser.tokens.actual.type == "PRINT":
if Parser.tokens.actual.type == "OPN_COM":
commands = Comandos()
commands.children.append(Parser.parseCommand())

while(Parser.tokens.actual.type == "ENDCOM"):
Parser.tokens.selectNext()
while(Parser.tokens.actual.type != "CLS_COM"):
commands.children.append(Parser.parseCommand())
if(Parser.tokens.actual.type != "ENDCOM"):
print(Parser.tokens.actual.type)
raise Exception("; not found")
Parser.tokens.selectNext()
if(Parser.tokens.actual.type != "END"):
commands.children.append(Parser.parseCommand())
if(Parser.tokens.actual.type == "CLS_COM"):
Parser.tokens.selectNext()
else:
raise Exception("} not found")
return commands
else:

raise Exception("BLOCK ERROR")
raise Exception("{ not found")

@staticmethod
def parseCommand():
Expand All @@ -279,24 +400,43 @@ def parseCommand():
if Parser.tokens.actual.type == "EQL":
assign = Assign("=", [])
assign.children.append(var_node)
value = Parser.parseExpression()
value = Parser.parseOrexPR()
assign.children.append(value)
if Parser.tokens.actual.type != "ENDCOM":
raise Exception("; NOT FOUND")

else:
print(Parser.tokens.actual.value)
raise Exception("COMMAND ERROR")

return assign


elif Parser.tokens.actual.type == "PRINT":
print_node = Println("PRINT", [])
print_value = Parser.parseExpression()
print_value = Parser.parseOrexPR()
print_node.children.append(print_value)
if Parser.tokens.actual.type != "ENDCOM":
raise Exception("; NOT FOUND")
return print_node

elif Parser.tokens.actual.type == "WHILE":
while_node = WhileOp('while', [])
Parser.tokens.selectNext()

if Parser.tokens.actual.type == 'OPN':
Parser.tokens.selectNext()
while_node.children.append(Parser.parseOrexPR())
if Parser.tokens.actual.type == 'CLS':
Parser.tokens.selectNext()
while_node.children.append(Parser.parseCommand())
else:
raise Exception("WHILE ERROR")
else:
raise Exception("WHILE ERROR")
return while_node

elif Parser.tokens.actual.type == "IF":
pass
else:
pass

Expand Down Expand Up @@ -325,7 +465,6 @@ def main():
resultado = Parser().run(comando)
ST = SymbolTable()
resultado.Evaluate(ST)
# print(ST.sym)

if __name__ == "__main__":
main()
11 changes: 8 additions & 3 deletions teste.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
x1 = 3; /* bla bla $x1 = 9999998 */
{x1 = 3; /* bla bla $x1 = 9999998 */
y2 = 4;
x = readln() + 2;
x = 1 + 2;
z_final = x1 + y2 *33;
println(x);
x = 2;
while (x && 4){
println(x);
x = x+1;}

println(2);}