LL(1) Recursive-Descent Lexer
Purpose
- 文字ストリームからトークンストリームを得る
- 文字ストリーム内のlexical patternを認識する
- 入れ子になったlexical structureも認識可能
Discussion
Implementation
- 2.4節の文法例を認識するlexerを作ってみよう
- テストコード
parsing/lexer/Test.java
- テストコード
- EOFに達するまで,入力文字列からトークンを抽出し,出力する
- Token,Lexer,ListLexerクラスが必要
- Tokenクラス
parsing/lexer/Token.java
- トークン型と文字列プロパティを持つ
- ListLexerクラス
- Lexerに入る前にリスト言語のlexerに着目
- トークン型を定義する
- nextToken()メソッドでは,トークンに一致させるメソッドを呼び出すか,適切なメソッドに渡す
- 識別子と一致した場合,先読み文字がアルファベットの間は文字をバッファリングする
- 空白文字が来たら,WS()メソッドを呼んで空白文字を消費する
- バッファリングもせず,トークンを返したりもしない
- Lexerクラス
parsing/lexer/Lexer.java
- 基底クラスであり,サポートコードである
- lexerの状態維持に必要なフィールドを持つ
- EOFおよびその型とか,入力文字列とか,現在の文字とか
- コンストラクタでは入力文字列を記録し,先読み文字を準備する
- consume()メソッドでは,入力位置を進め,先読み文字を次の文字に設定する
- 終端まで来たらEOFに設定
- Lexerクラスには実際のトークンとマッチングを取るコードが無いので,Lexerクラスは抽象クラス
- Lexerの具象子クラス(ListLexer)で,nextToken()とgetTokenName()を実装する