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의 기본 기능만 설명한다고 한다.그곳은 매우 매력적이다.
또 체계적인 정보 시스템 교육을 받지 않은 내가 어느 정도 이해할 수 있는지에 대해서도 흥미를 느낀다.

할 일을 결정하다

  • 이 책은 200페이지 정도 됩니다...!!읽으면서 레슨을 받다.
  • 좋아하는 해석기를 만들어 보세요.
  • 학습 방법


    책의 흐름에 따라 손을 옮기다.책에 Monkey라는 언어가 설치되어 있는 것 같다.
    나는 동력Bear을 유지하기 위해 (beargraming)이라는 언어로 노력한다.
  • Lexing
  • Parsing
  • Evaluation
  • 이 책은 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에 가려고 했는데 렉싱까지밖에 못 갔어요...나의 회한...!!!
    제가 일본어를 너무 못해서 여러분께 읽어드리기 위해서 이렇게 엄격한 보도가 있어서 죄송합니다.
    하지만, 나는 징계하지 않고 계속할 것이다...!!!아이고, 정말 기쁘다ʕ•ᴥ•ʔ
    그리고 너무 기뻐요. 같이 할 사람 있어요?

    메모지

  • 언어의 주요 구성:
  • the lexer
  • the parser
  • the Abstract Syntax Tree (AST)
  • the internal object system
  • the evaluator
  • tree-walking
  • 이 책은 몽키라는 언어를 분석해 평가한다.
  • 이렇게 하면 베어도 되나...!!!
  • 프로그래밍 언어 Bear(불러오기)
  • C 언어 문법
  • 가변 귀속
  • 정수/가짜
  • 사기식
  • 삽입 함수
  • 클론
  • 문자열 데이터 구조
  • 어레이 데이터 패브릭
  • 해시 데이터 구조
  • 좋은 웹페이지 즐겨찾기