PL λαβ
Lab 1.2b[박인철]: 구문 분석기 본문
아직 코드가 완벽하지 않아서 내일 더 수정하겠습니다.
from enum import Enum
class Type(Enum):
DataType_Nil = 1
DataType_Pair = 2
DataType_Symbol = 3
DataType_Integer = 4
class Keyword(Enum):
Plus_OP = 0
Minus_OP = 1
Mul_OP = 2
Div_OP = 3
Lparen = 5
Rparen = 6
Larrow = 8
Rarrow = 9
class TokenSet:
def __init__(self):
self.stack = []
def add(self, value):
self.stack.append(value)
return
def _show(self):
for i in range(len(self.stack)):
print(self.stack[i])
class Pair:
def __init__(self, value):
self.value = value
def __str__(self, value):
return "({value} . {anotherValue})".format(self.value[0], self.value[1])
class Data:
def __init__(self, type, value):
self.type = type
self.value = value
def __str__(self):
#return str(self.type)+ "."+str(self.value)
return str(self.value)
def __repr__(self):
return self.__str__()
def casting(self, type):
self.type = type
def car(token):
if isinstance(token.value, list):
return token.value[0]
else:
return token.value
def cdr(token):
if isinstance(token.value, list):
return token.value[-1]
else:
return token.value
def cons(token, anotherToken):
data = Data(type = Type.DataType_Pair, value = (token, anotherToken))
print(f"({token.value} . {anotherToken.value} )")
return data
def makeInt(token):
try:
temp = int(token)
return temp
except ValueError:
return None
def makeSym(token):
try:
temp = str(token)
return temp
except ValueError:
return None
def parser(text):
if text is None:
raise Exception("Input file is None")
pos = 0 ; tokenSet = TokenSet()
while True:
try:
if text[pos] == "(":
tokenSet.add(Data(Keyword.Lparen, text[pos]))
elif text[pos] == ")":
tokenSet.add(Data(Keyword.Rparen, text[pos]))
elif text[pos] == "+":
tokenSet.add(Data(Keyword.Plus_OP, text[pos]))
elif text[pos] == "-":
tokenSet.add(Data(Keyword.Minus_OP, text[pos]))
elif text[pos] == "*":
tokenSet.add(Data(Keyword.Mul_OP, text[pos]))
elif text[pos] == "/":
tokenSet.add(Data(Keyword.Div_OP, text[pos]))
elif text[pos] == ">":
tokenSet.add(Data(Keyword.Rarrow, text[pos]))
elif text[pos] == "<":
tokenSet.add(Data(Keyword.Larrow, text[pos]))
elif makeInt(text[pos]) != None:
tokenSet.add(Data(Type.DataType_Integer, text[pos]))
pos += 1
except IndexError as E:
break
return tokenSet
def isalp(x):
result=[]
for i in range(len(x)):
if x[i].isalpha():
result.append(x[i].upper())
elif x[i].isdigit():
result.append(str(x))
print("(", end="")
for j in range(len(result)):
print(f" {result[j]} ", end='')
if j != len(result)-1:
print(" . ", end='')
print(")", end="")
def printExpr(node):
if node[0] != "(":
if node.isdigit():
return node
else:
res = isalp(test)
return res
elif node[0] == "(" and node[1] == ")":
print ("NIL")
else:
isalp(node)
if __name__ == "__main__":
test = input()
printExpr(test)
# 42
42
# ()
NIL
#(a.b.c)
(A. B. C)
#(asd)
(ASD)
'kos' 카테고리의 다른 글
Lab 1.2c[최준혁]: 구문 분석기 (0) | 2021.04.13 |
---|---|
Lab 2.1: 환경 (0) | 2021.04.13 |
Lab 1.2b[최준혁]: 구문 분석기 (0) | 2021.04.12 |
Lab 1.2b[김예령]: 구문 분석기 (0) | 2021.04.12 |
Lab 1.2a[최준혁]: 구문 분석기 (0) | 2021.04.08 |
Comments