PL λαβ

Lab 1.2b[박인철]: 구문 분석기 본문

kos

Lab 1.2b[박인철]: 구문 분석기

inchulnim123 2021. 4. 13. 00:09

아직 코드가 완벽하지 않아서 내일 더 수정하겠습니다.

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