Compiler

Last-modified: 2010-05-19 (水) 23:18:26

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()を実装する