Go 言語で作るインタプリタ
Lexical Analysis(字句解析)
https://en.wikipedia.org/wiki/Lexical_analysis
lexer, tokenizer 又は scanner などと呼ばれるものを使って、ソースコード等(sequence of characters)をトークン(sequence of tokens)に変換すること
別名、lexing 又は tokenization ともいう。
lex x = 5 + 5;
上記をトークンで表すと、例えば次のような形になる。
[
  LET,
  IDENTIFIER("X"),
  EQUAL_SIGN,
  INTEGER(5),
  PLUS_SIGN,
  INTEGER(5),
  SEMICOLON
]
トークンの定義
出現が予想されるトークンを定義する。
package token
type TokenType string
type Token struct {
  Type    TokenType
  Literal string
}
const (
  ILLEGAL = "ILLEGAL" // 解析不能な字句
  EOF     = "EOF"
  // 識別子
  IDENT = "IDENT" // x, y など
  // リテラル
  INT = "INT" // 整数 1, 2, 3 など
  // 演算子
  ASSIGN = "="
  PLUS   = "+"
  // デリミタ
  COMMA     = ","
  SEMICOLON = ";"
  LPAREN    = "("
  RPAREN    = ")"
  LBRACE    = "{"
  RBRACE    = "}"
  // キーワード
  FUNCTION = "FUNCTION"
  LET      = "LET"
)
Lexer(字句解析器)
ソース参照
Parse(構文解析)
Lexer によって生成されたトークンを基に、何らかのデータ構造を構築する。
JSON.parse()も立派な構文解析器であり、プログラミング言語の構文解析器と基本的な作りは変わらない。
データ構造
- Syntax Tree(構文木)
 - Abstract Syntax Tree; AST(抽象構文木)
 
Syntax Tree から、セミコロンや改行といった補助的なものを取り除いたものが AST である。
memo
- 式 expression --- 値を生成する
 - 文 statement --- 値を生成しない