Writing An Interpreter In Go Lexing
4508 단어 Go
감탄층이 얇고 40대 전반부의ʕ•ᴥ•ʔ네.젊고 우수한 사람들이 활발하게 활동하는 갈비뼈는 올해 11월부터 동료를 영입하기 시작했다.
세 편의 Advent Calendar의 미친 듯한 아름다운 환경!그리고
関
뭔데?어떻게 된 거야?담당Livesense-Advent Calendar 끄기 2017 20일차.
그나저나 엔지니어로서의 3대 미덕으로는 태만, 성급, 오만 등이 있다.
오만:
지나친 자존심은 신의 벌을 받을 수도 있다.
남에게 부끄럽지 않은 프로그램을 쓰거나 유지하려는 성격.
관우는 자존심이 매우 강해서 오만한 태도로 자신의 파멸을 초래했다고 한다.
나는 프로그래머로서의 미덕이 오만하다고 생각한다...내 생각엔
이 때문에 연결된 것처럼 전혀 연결되지 않는다는 것
関
관계가 없다는 것이다..
.
.
.
.
갑자기 이제야 샀어요Writing An Interpreter In Go.
왜 이제 읽지?
회사 내 매주 개최
Goの標準ライブラリを読み解く会
.Go의 Go 자체는 Go로 썼다(일부가 그렇지 않아 어셈블러를 읽을 수 없다...).그리고 원본 코드는 매우 간단하고 이해하기 쉬워서 도움이 된다.
하지만 나는 내가 어떻게 분위기 속에서 Go와 사귀었는지 알게 되었다...분위기 is 타락...
그래서 고력을 높이기 위해 이 책을 선택했다.
Go의 기본 기능만 설명한다고 한다.그곳은 매우 매력적이다.
또 체계적인 정보 시스템 교육을 받지 않은 내가 어느 정도 이해할 수 있는지에 대해서도 흥미를 느낀다.
할 일을 결정하다
학습 방법
책의 흐름에 따라 손을 옮기다.책에
Monkey
라는 언어가 설치되어 있는 것 같다.나는 동력
Bear
을 유지하기 위해 (beargraming)이라는 언어로 노력한다.Go1.7
에서 이루어진 것 같은데, 수중에 있는 것이 매우 많다.Lexing
렉싱의 시작.
Lexing은 문구 해석입니다(Lexical Analysis라고도 함).프로그램 전체에서 정의된 명령과 상수를 잘라내는 작업을 가리킨다.(와,설명)
ソースコード -> トークン -> 抽象構文木
렉싱은 소스 코드를 토큰으로 변환한 다음 Parsong을 통해 토큰을 추상 구문 트리로 변환합니다.여기서 공백은 영패의 구분자로만 처리됩니다.어떤 언어에서는 공백의 길이가 매우 중요하다.
또한 행, 열 번호, 파일 이름을 영패에 추가하면 문법을 해석할 때 작용한다.
대량의 데이터를 가져올 때도 그런 데이터를 원할 것이다...어디서 무슨 일이 일어났는지 심리적으로 알면 마음이 놓인다.
하지만 처음엔 이루지 못했다.나중에 보충하자...(TODO)
그리고 드디어 쓰기 시작했어요...!!!하지만 Golint는 많은 말을 했어요...
Go1.9.2
지금 바뀌어서 따라가지 못해서 곤란해요.대신 그 외의 일은 가급적 처리하면서 진행하기로 했다.
우선 유한한 영패를 상수로 정의한다.
const (
ILLEGAL = "ILLEGAL"
EOF = "EOF"
IDENT = "IDENT"
INT = "INT"
ASSIGN = "="
PLUS = "+"
COMMA = ","
SEMICOLON = ";"
LPAREN = "("
RPAREN = ")"
LBRACE = "{"
RBRACE = "}"
FUNCTION = "FUNCTION"
LET = "LET"
)
이후 실제 렉서를 쓰면 먼저 테스트부터 이루고 싶은 것을 쓴 뒤 실장 내용의 흐름을 단계적으로 설명한다.매우 알기 쉽다.switch에서 그 문자를 하나하나 검사하고 const로 정의된 영패를 반환한 다음 되돌려줍니다.를 참고하십시오.
이번에 제작된 언어는 변수로 사용할 수 있다
by other packages
.func isLetter(ch byte) bool {
return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_'
}
공백은 구분자로만 처리되기 때문에 건너뛰기 처리도 추가되었습니다.unicode.IsSpace는 Rune입니다. 그런데 이것도 이용할 수 있나요...?
for l.ch == ' ' || l.ch == '\t' || l.ch == '\n' || l.ch == '\r' {
// readChar
}
이 밖에 여기에서 만든 언어는 정수만 지원합니다.이때의 시험은 이런 느낌이었다.
let black_bear = 5;
let polar_bear = 10;
let add = fn(x, y) {
x + y;
};
let result = add(black_bear, polar_bear);
Lexing의 확장
각종 연산자,if,else,return을 처리할 수 있습니다.
_
와 ==
두 단어는 모두 같은 뜻을 가지고 있기 때문에 switch의case에서 앞의 문자를 보고 산자를 판단하는 방법을 알게 되었다.베어 테스트에서 추가 처리되더라도
!=
됐다.!-/*5;
5 < 10 > 5;
if (5 < 10) {
return true;
} else {
return false;
}
10 == 10;
10 != 9;
REPL의 터치
REPL 구현하지만 결국
SUCCESS
.하지만 1장 단계에서 완성돼 기쁘다.
마지막(마지막이 아님)
AST에 가려고 했는데 렉싱까지밖에 못 갔어요...나의 회한...!!!
제가 일본어를 너무 못해서 여러분께 읽어드리기 위해서 이렇게 엄격한 보도가 있어서 죄송합니다.
하지만, 나는 징계하지 않고 계속할 것이다...!!!아이고, 정말 기쁘다ʕ•ᴥ•ʔ
그리고 너무 기뻐요. 같이 할 사람 있어요?
메모지
Reference
이 문제에 관하여(Writing An Interpreter In Go Lexing), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mi-bear/items/015fc06545adf75884de텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)