mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 12:24:45 +00:00
1.4 KiB
1.4 KiB
Lexing (字句解析)
字句解析を行うのはerg_parser/lex.rs
に定義されるLexer
である。
これはイテレータとして実装されており、Token
という構造体を返す。
Token
はErgの字句を表す構造体で、種別としてTokenKind
, ソースコード上の位置情報、そして文字列表現を持つ。
Token
はLocational
トレイトを実装する最小の構造体である。Locational
トレイトはLocation
という列挙体を返すloc()
メソッドを持つ。
これはソースコードの位置を表す。
イテレータであることからも分かるように、Lexerは使い捨ての構造体である。
これを連続して使えるようにラップしたのがLexerRunner
である。この構造体はRunnable
トレイトを実装しており、コマンドラインオプションを渡して実行したり、REPLとしても使ったりすることができる。
ErgのLexerの特徴的な点は、インデントを字句として扱うことである。これはPython等のIndent-sensitive言語の字句解析と同じである。
ErgのLexerはインデント/Dedentの数が合うかチェックするが、文法的に正しい使い方をしているかはチェックしない。 例えば、字句解析の時点では以下のコードはエラーにならない。
i = 1
j = 2
k = 3
これがエラーになるのはParser
の構文解析時である。