Skip to content
Merged

V2.2 #23

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
Next Next commit
issues almost done
  • Loading branch information
lucafs committed May 12, 2021
commit 5bb17bcced853786f2da6d286f95777135de4873
72 changes: 43 additions & 29 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def tToken_finder(char):
return "GREATER"
elif(char == "<"):
return "LESS"
elif(char == "!"):
return "NEG"
elif(char == "&"):
return "AND"
elif(char == "│"):
Expand All @@ -38,6 +40,20 @@ def tToken_finder(char):
else:
return "?"


def IdentType(char):
if(char == "println"):
return "PRINT"
elif(char == "readln"):
return "READ"
elif(char == "if"):
return "IF"
elif(char == "else"):
return "ELSE"
elif(char == "while"):
return "WHILE"


class SymbolTable:

def __init__(self):
Expand Down Expand Up @@ -99,38 +115,40 @@ def Evaluate(self, ST):
print(print_value)

class ReadLn(Node):
def Evaluate(self, st):
def Evaluate(self, ST):
return int(input())

class LogOp(Node):

def Evaluate(self, st):
def Evaluate(self, ST):
if self.value == "<":
return self.children[0].Evaluate(st) < self.children[1].Evaluate(st)
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)
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)
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)
return self.children[0].Evaluate(ST) or self.children[1].Evaluate(ST)
elif self.value == "!":
return not self.children[0].Evaluate(ST)
elif self.value == "││":
return self.children[0].Evaluate(st) and self.children[1].Evaluate(st)
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)
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)
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)
self.children[2].Evaluate(ST)



Expand Down Expand Up @@ -197,6 +215,10 @@ def selectNext(self):
break
if(self.position == len(self.origin)):
break
identT = IdentType(self.actual.value)
if(identT != None):
self.actual.type = identT


if((self.position < len(self.origin)) and self.actual.type == "ENDCOM"):
while(tToken_finder(self.origin[self.position]) == "ENDCOM"):
Expand All @@ -222,18 +244,6 @@ def selectNext(self):
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 == "else"):
self.actual.type = "ELSE"
elif(self.actual.value == "while"):
self.actual.type = "WHILE"
return self.actual


Expand Down Expand Up @@ -340,7 +350,7 @@ def parseFactor():
node.value= Parser.tokens.actual.value
Parser.tokens.selectNext()
return node
elif(Parser.tokens.actual.type == "SUM" or Parser.tokens.actual.type == "MIN"):
elif(Parser.tokens.actual.type == "SUM" or Parser.tokens.actual.type == "MIN" or Parser.tokens.actual.type == "NEG"):
if(Parser.tokens.actual.type == "SUM"):
node = UnOp("+", [])
node.children.append(Parser.parseFactor())
Expand All @@ -349,6 +359,10 @@ def parseFactor():
node = UnOp("-", [])
node.children.append(Parser.parseFactor())
return node
elif(Parser.tokens.actual.type == "NEG"):
node = LogOp("!", [])
node.children.append(Parser.parseFactor())
return node
elif(Parser.tokens.actual.type == "OPN"):
res = Parser.parseOrexPR()
if(Parser.tokens.actual.type != "CLS"):
Expand All @@ -373,7 +387,6 @@ def parseFactor():

@staticmethod
def parseBlock():
Parser.tokens.selectNext()
if Parser.tokens.actual.type == "OPN_COM":
commands = Comandos()
Parser.tokens.selectNext()
Expand Down Expand Up @@ -453,7 +466,7 @@ def parseCommand():
elif Parser.tokens.actual.type == "ENDCOM":
return NoOp()
else:
Parser.parseBlock()
return Parser.parseBlock()


@staticmethod
Expand All @@ -462,6 +475,7 @@ def run(code):
code = PrePro().filter(code)
#executa o compilador
Parser.tokens = Parser().tokens(origin = code)
Parser.tokens.selectNext()
res = Parser().parseBlock()
if(Parser.tokens.actual.type != "END"):
raise Exception ("ERROR")
Expand Down
10 changes: 6 additions & 4 deletions teste.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{x1 = 3; /* bla bla $x1 = 9999998 */
while(x1 < 100000)
x1 = x1 + 65;
println(x1);}

{
if ((1==1)){
println(1);
}
}