FreeBASIC マニュアルのトップに戻る

FreeBASIC DevFbcLexerTokens

目次→FreeBASIC のハッキング→FreeBASIC でのハッキングのための情報Lexer(字句解析器) と Preprocessor(前処理)Tokens←オリジナル・サイト

トークン(通信セッションやアクセス制御で、識別子として使われる小さなデータ)



インターフェース

lexer の基本的な公のインターフェースは、lex.bas からです:

現在のトークンと先読みトークン(Current token + look ahead tokens)

トークンは、かなり短い生物です。
トークンの待ち行列には、現在のトークンと、2、3の先読みトークンがあるだけです。
トークンは、FBコードを解読するするパーサーに必要なすべてです。
普通のパターンは、現在のトークンをチェックして、それが何であるかについて基づいて次にすべきことを決めて、それからトークンをスキップして、進むことです。 逆行は、できません。
また、報告しているエラーの間に示される、ファイル名、行番号、トークンの位置は、現在の lexer の状態から来ます。

トークンの待ち行列は、トークンの静的配列です。現在のトークンと少しの先読みトークンのために、空白を含んでいます。
トークンの構造は、トークンのテキストのために、かなり巨大な(静的な)バッファを含みます。
各々のトークンは、次のものへのポインターがあるので、これらは循環リストになります。
これは、配列インデックスを世話する必要なしに、前進し、そして、トークンをスキップする、安い方法です。
トークン自体のまわりでコピーすることは、もってのほかです。なぜなら、テキスト・バッファは、巨大だからです。
"head" は、現在のトークンを指します ; 次の "k" トークンは、先読みトークンです ; 残りは使っていません。
スキップするとき、単純に "head = head->next" を実行します。
新しい頭が、トークンをすでに含まなければ(以前に行われた先読みから)、新しいトークンを、新しい現在のトークンの構成に、ロードします(lexNextToken() を通して)。
先読みは、待ち行列に、次のトークンをロードする(しかし、現在のものをスキップすることなく)ことによって、働きます。

トークン化(Tokenization)
lex.bas:lexNextToken()

lexer は、入力されるファイルをトークンに分割します。
トークンは、概念的に、識別子、キーワード、文字列直定数、数値直定数、演算子、EOL または EOF 、あるいは、括弧とコンマのような他の文字です。
一意的な値としての各々のトークンは、文字列比較(あまりに遅い)する代わりに、値を確認するために、パーサーが使うように、割り当てました。

入力を解析するために、lexNextToken() は、現在の文字と、もし必要ならば、さらに先読み文字を、使用します。
数値定数と文字定数は、ここでまた扱われます。
英数字の識別子は、symb ハッシュ・テーブルで調べられます。symb ハッシュ・テーブルは、それが、キーワード、マクロあるいは別の FB シンボル(型、手続き、変数...)かどうか、見分けます。

点(QB互換性) と識別子型接尾辞(stringvar$ のように)を含んでいる識別子は、ここでまた取り扱われます(しかし、名前空間/構造メンバー・アクセスではなく)。
トークンは、データ型を、それらと結びつけておくことができます。
それが数値定数でも使われます。そして、それは型接尾辞(&hFFFFFFFFFFFFFFFFull のように)を持っていることができます。

1行コメントについての注釈

極めて異例ですが、一行コメントは、lexer でスキップされる代わりに、パーサーによって扱われます。
これは、REM の使用法が、QB でのように、簡単に制限されるように、行われます。やはり、REM は、コメントよりは命令文に似ています。
また、コメントは、QB メタ命令文を含むことができるので、コメントは、単純に無視できないのです。
パーサーが、QB メタ命令文を見つけなければ、パーサーは、コメントの残りを(それをトークン化することなく)スキップします。

(しかし、複数行コメントは、トークン化の間、完全に扱われます。)

ファイル入力
lex.bas:hReadChar()

入力ファイルは、fb.bas:fbCompile()で開かれます; ファイル番号は、グローバル env 文脈(fb.bas:fbIncludeFile() の #includes の類似)に保管されます。
lexer は、入力を読むために、env 文脈から、ファイル番号を使います。
それは、静的 zstring バッファを持ちます。バッファは、ファイル内容を(一文字ずつ読む代わりに)流れ出させるために用いられます。そして、ユニコード入力については、lexer は wstring バッファを使って、UTF32 または UTF8 を、UTF16 にコード変換します。
lexer は、バッファ中の文字のならびを進んで、そして、ファイルから次の塊を読み取ります。
EOF は、NULL 文字を返すことによって表されます。

FreeBASIC の開発者用情報 に戻る
目次に戻る
ページ歴史:2016-03-12 13:22:54
日本語翻訳:WATANABE Makoto、原文著作者:DkLwikki

ホームページのトップに戻る

表示-非営利-継承