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 --- 値を生成しない