---
# System prepended metadata

title: インタプリタ

---

# インタプリタ

- 一章
    - 字句解析機(lexer)
        - 文字列を単語レベルで分解し、トークン列として出力する
            - 単語例
                - let, fn, return等の予約語
                - +, -, *, /, =等の演算子
                - hoge, 0, true等の変数、定数、値、関数名とか
                - (), ;等のデリミタ
            - 上から一文字ずつ見ていって、一定のパターンに当てはまればトークンとして切り出すみたいな
            - ここでは構文の正しさを保証しない
    - REPL
        - Pythonの対話モードや、rails consoleみたいなやつ
- 2章
    - 構文解析機(parser)
        - 文字列を先頭から逐次Tokenにしながら読んでいく
        - セミコロンかEDFでStatementを区切り、Statementの配列を作る
            - 今回は抽象構文木(AST)
        - letとかreturnとかは文の構造を定義してるだけ
            - letだったら`let identifier = expression`だよね
            - returnだったら`return returnValue`だよね
- 3章
    - 評価(evaluator)
    - 構文解析機から吐き出された構文木を評価して値を返す
    - 環境と関数
        - evaluatorは環境を持ち、identifierと値の紐づけを環境に保存する
        - 関数は引数, 処理内容のほかに、固有の環境を持つ
        - 引数や関数ごとの一時変数とか入れておく
        - これによってプログラム全体の環境とのスコープわけが実現される

- 後でググる
    - p.90: TestParsingInfixExpressions

- 次週課題
    - p81: 左結合力・右結合力
    - parser.go:222のleftExp = infix(leftExp)ってなんだ

- 全体の流れ
    - parserがlexer.NextTokenを呼び出して、逐次文字列からTokenを切り出しながら構文木作ってる
    - 後でparseProgram確認しなおす
     ```go
    func testEval(input string) object.Object {
        l := lexer.New(input)
        p := parser.New(l)
        program := p.ParseProgram()
        env := object.NewEnvironment()

        return Eval(program, env)
    }

- メモ
    - expectPeek時にtrueを返す時、nextTokenしている。
    - expectPeekによって、構文の正しさを検証しながらtokenを進めている
        - すなわち、文の構造はexpectTokenによって定義される
    - 構文解析機の優先度の部分
    - 評価機のenviromentの
    

- 拡張機能
    - 関数にデフォルト値を実装
    - キーワード引数の実装
    - FunctionLiteralのParametersをIdentifierの配列から、Argumentの配列に変更
        - ArgumentはIdentifierとDefaultValueを持つ構造体
        - ParseFunctionParameters時にdefault値の有無を確認し、なければArgument.DefaultValueにnullTokenを、そうでなければその値のTokenを格納する。
    - 配列の結合


* 宿題：振り返りをまとめる

