PL λαβ
Lab 5.1a[김예령]: 한글 스킴 본문
# Goal
- 주석 제거하기(한줄, 여러줄): 한줄 주석 제거 완료
- 키워드 한글 변환: 변환 완료
- 플러그인과 결합: 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