PL λαβ

Lab 5.1a[김예령]: 한글 스킴 본문

kos

Lab 5.1a[김예령]: 한글 스킴

IC4RUS 2021. 5. 4. 20:51

# Goal

  1. 주석 제거하기(한줄, 여러줄): 한줄 주석 제거 완료
  2. 키워드 한글 변환: 변환 완료
  3. 플러그인과 결합: Not Yet

 

# Comment

  • 여전히 tuple error를 해결하지 못하였습니다..
    ({에러}*, 값) 형태의 튜플때문에 값에 접근하기 위한 cdr, car, type, value들이 다 tuple error 트리거가 되어서 구조를 파악해 제거해야할 것 같습니다. 
  • vscode 플러그인에 추가하는 건 아까 언급하신것처럼 인터프리터 따로 배포해서 설치후 extension에 적용한다 생각하고 진행하도록 하겠습니다.

 

# Test

>> (정의 한글 30)
한글
>> 한글
(<ErrorType.ERROR_OK: 'No Error'>, 30)
>> (람다 (가) (+ 가 가))
[ENV class : root, ((가) . (+ . 가 . 가))]
>> (만약 1 1 nil)
1
>> (만약 nil 1 nil) 
NIL
>> (쌍쌍 10 20)
(<ErrorType.ERROR_OK: 'No Error'>, (10 . 20))
>> (머리 1 2 3 4 5)
(<ErrorType.ERROR_OK: 'No Error'>, 1)
>> (꼬리 1 2 3 4 5) 
(<ErrorType.ERROR_OK: 'No Error'>, (2 . 3 . 4 . 5))
>> (쿼트 10)
10
>> ;...이것은 주석입니다
NIL
>> ;...(정의 주석 130) 
NIL

 

# Code

class Lexer:
    def __init__(self, text):
        self.pos = 0
        self.text = text if len(text) != 0 else Err(Type.NIL, ErrorType.NO_INPUT_FILE)
        self.currentToken = self.text[self.pos]

    def eat(self, tokenType):
        if self.currentToken == tokenType:
            return True
        return False

    def jmp(self):
        if self.pos == len(self.text) - 1:
            self.currentToken = None
            return False
        else:
            self.pos += 1
            self.currentToken = self.text[self.pos]
            return True

    def lex(self):
        lexR = []
        # print("===== === LEX === =====")
        while True:
            if self.pos == len(self.text) or self.currentToken == None:
                break

            if self.currentToken.isspace():
                try:
                    while self.currentToken.isspace():
                        self.jmp()
                except:
                    break

            elif self.currentToken == ".":
                self.jmp()

            elif self.currentToken == "(":
                if not self.eat("("):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("(", Keyword.LPAREN))
                self.jmp()
                if self.currentToken == ")":
                    lexR.append(Token(")", Keyword.RPAREN))
                    self.jmp()

            elif self.currentToken == ")":
                if not self.eat(")"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token(")", Keyword.RPAREN))
                self.jmp()

            elif self.currentToken == ";":
                flag = 3
                while flag:
                    self.jmp()
                    if self.currentToken == ".":
                        flag = flag - 1
                        pass
                    else:
                        break
                lexR.append(Token("Nil", Type.NIL))
                return lexR

            elif self.currentToken.isalpha():
                id = ""
                while self.currentToken.isalpha() and self.currentToken is not None:
                    if self.currentToken.isalpha():
                        id += self.currentToken
                        if self.jmp():
                            pass
                        else:
                            break
                if id == "람다":
                    lexR.append(Token("LAM", Keyword.LAMBDA))
                elif id == "정의":
                    lexR.append(Token("DEF", Keyword.DEF))
                elif id == "Nil":
                    lexR.append(Token("NIL", Type.NIL))
                else:
                    lexR.append(Token(id, Type.SYM))

            elif self.currentToken.isdigit():
                num = ""
                realFlag = False
                while self.currentToken.isdigit() or self.currentToken == ".":
                    if self.currentToken == ".":
                        realFlag = True
                        num += self.currentToken
                        if self.jmp():
                            pass
                        else:
                            break
                    else:
                        num += self.currentToken
                        if self.jmp():
                            pass
                        else:
                            break
                if realFlag:
                    lexR.append(Token(num, Type.REAL))
                else:
                    lexR.append(Token(num, Type.INT))

            elif self.currentToken == "+":
                if not self.eat("+"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("+", Keyword.PLUS_OP))
                self.jmp()

            elif self.currentToken == "-":
                if not self.eat("-"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("-", Keyword.SUB_OP))
                self.jmp()

            elif self.currentToken == "*":
                if not self.eat("*"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("*", Keyword.MUL_OP))
                self.jmp()

            elif self.currentToken == "/":
                if not self.eat("/"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("/", Keyword.DIV_OP))
                self.jmp()

            elif self.currentToken == "=":
                if not self.eat("="):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("=", Keyword.EQ_OP))
                self.jmp()

            elif self.currentToken == "<":
                if not self.eat("<"):
                    return Err(self.currentToken, ErrorType.UNEXPECTED_TOKEN)
                lexR.append(Token("<", Keyword.LESS_OP))
                self.jmp()

        # print(lexR)
        # print("===== === OUT === =====")
        return lexR

'kos' 카테고리의 다른 글

Lab 5.1a[최준혁]: 한글 스킴  (0) 2021.05.04
Lab 4.1a[최준혁]: 조건, 비교  (0) 2021.05.02
Lab 4.1a[김예령]: 조건, 비교  (0) 2021.04.29
Lab 3.1a[김예령]: 람다와 클로저  (0) 2021.04.29
Lab 3.1a[최준혁]: 람다와 클로저  (0) 2021.04.27
Comments