erg/doc/JA/compiler/phases/01_lex.md
2022-12-08 21:16:43 +09:00

23 lines
1.4 KiB
Markdown

# 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の数が合うかチェックするが、文法的に正しい使い方をしているかはチェックしない。
例えば、字句解析の時点では以下のコードはエラーにならない。
```python
i = 1
j = 2
k = 3
```
これがエラーになるのは`Parser`の構文解析時である。