mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 21:01:10 +00:00
23 lines
1.4 KiB
Markdown
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`の構文解析時である。
|