# インタプリタ - 一章 - 字句解析機(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を格納する。 - 配列の結合 * 宿題:振り返りをまとめる
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up