LexとYacc学習(四)のLex規範

1857 ワード

Lex仕様の構造
lexプログラムは、定義セグメント、ルールセグメント、およびユーザーサブインスタンスセグメントの3つの部分から構成されます.
...セグメントを定義...
%%
...ルール・セグメント...
%%
...ユーザサブインスタンスセグメント...
これらの部分は、2つのパーセンテージで構成された行で区切られています.一部は空にできますが、最初の2つの部分は必須で、3番目の部分と前の%行は無視できます.
セグメントの定義
定義セグメントには、テキストブロック、定義、内部テーブル宣言、開始条件、および変換が含まれます.
空白で始まる行はCファイルに逐字コピーされ、通常は/*と*/に囲まれた注釈を含むために使用され、一般的には前に空白がある.
ルールセグメント
ルールセグメントには、モード行とCコードが含まれ、空白で始まる行または%{と%}に囲まれた内容がCコードです.他の形式で開始される行は、モード行です.
Cコードは生成されたCファイルに逐字コピーされる.
lexスキャンプログラムが実行されると、入力はルールセグメントのモードと一致します.マッチング(マッチングされた入力をタグと呼ぶ)が発見されるたびに、そのモードに関連するCコードが実行される.パターンの後ろに|記号が付いている場合、このパターンはファイル内の次のパターンと同じCコードを使用します.文字不一致モードを入力すると、構文解析プログラムの動作はコードECHOのモードに一致し、ECHOはタグのコピーを出力に書き込むようになります.
ユーザサブインスタンスセグメント
ユーザサブルーチンセグメントの内容はlexによってCファイルに逐字コピーされ、この部分は通常、ルールから呼び出されたルーチンを含む.Input()、unput()、output()、またはyyywrap()を再定義する場合は、新しいバージョンまたはサポートサブルーチンをここに置くことができます.
lexライブラリ
ほとんどのlex実装では、UNIXシステムのccコマンドラインの最後(または他のシステムの等価物)に-llフラグを与えることによってライブラリにリンクする有用なインスタンスライブラリが必要です.ライブラリの内容は実装によって変わりますが、main()は常に含まれています.
main()
lexのすべてのバージョンには最小main()プログラムがあり、短いプログラムとテストに役立ちます.非常に簡単で、次のような内容です.
main(argc,argv)
int argc;
char **argv;
{
      yylex();
      return 0;
}
int yywrap()
{
      return 1;
}

yyleng()
スキャンプログラムがタグに一致する限り、タグのテキストは空の文字で終了する文字列yytextに格納され、その長さはyylengに存在し、yyleng()が返す値はstrlen(yytext)が返す値と同じである.
yylex()
lexで作成されたスキャンプログラムにはエントリポイントyylex()があります.yylex()を呼び出してスキャンを開始または再開します.lexアクションが呼び出しプログラムに数値を渡すreturnを実行すると、yylex()の次回の呼び出しは停止した場所から続行されます.
yywrap()
構文解析プログラムがファイルの末尾に遭遇すると、ルーチンyyywrap()を呼び出して次のステップで何をするかを特定します.yywrap()が0を返すと、スキャンプログラムはスキャンを続け、1を返すと、スキャンプログラムはレポートファイルの末尾のゼロタグを返します.
lexライブラリのyyywrap()の標準バージョンは常に1を返しますが、それを自分の値で置き換えることができます.yywrap()がより多くの入力があることを示す0を返す場合は、まず新しいファイルを指すyinを調整する必要があります.fopen()を使用する必要がある場合があります.