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

1.4 KiB

Lexing (字句解析)

字句解析を行うのはerg_parser/lex.rsに定義されるLexerである。 これはイテレータとして実装されており、Tokenという構造体を返す。 TokenはErgの字句を表す構造体で、種別としてTokenKind, ソースコード上の位置情報、そして文字列表現を持つ。 TokenLocationalトレイトを実装する最小の構造体である。LocationalトレイトはLocationという列挙体を返すloc()メソッドを持つ。 これはソースコードの位置を表す。

イテレータであることからも分かるように、Lexerは使い捨ての構造体である。 これを連続して使えるようにラップしたのがLexerRunnerである。この構造体はRunnableトレイトを実装しており、コマンドラインオプションを渡して実行したり、REPLとしても使ったりすることができる。

ErgのLexerの特徴的な点は、インデントを字句として扱うことである。これはPython等のIndent-sensitive言語の字句解析と同じである。

ErgのLexerはインデント/Dedentの数が合うかチェックするが、文法的に正しい使い方をしているかはチェックしない。 例えば、字句解析の時点では以下のコードはエラーにならない。

i = 1
    j = 2
k = 3

これがエラーになるのはParserの構文解析時である。