MemoMemo

Flex

最終更新:

kiminori_hirose

- view
管理者のみ編集可

Flex 2.28


アクションの前に常に実行されるアクションを定義したい。

YY_USER_ACTIONマクロに定義します。ただし、<<EOF>>のアクションの前には実行されないようです。例のようにバイト数カウンターを作成するときにyymore()関数、yyless()関数、unput()関数、input()関数を使用した場合はアクション内でカウンターを編集する必要があります。

例:#define YY_USER_ACTION nCounter+=yyleng;

初期時だけ実行されるアクションを定義したい。

YY_USER_INITマクロに定義します。ただし、このマクロが実行される時点では、yyout関数は利用できません。

例:#define YY_USER_INIT nCounter=0;

マッチした文字列をなかったことにして、入力ストリームに戻したい。

yyless(n)関数を使用します。マッチした文字列の先頭からnで指定したバイト数をyytextに残して、それ以降の文字列を入力ストリームに戻します。yyless関数を呼び出した後にはyytextやyylengの値が変更されます。n=0のときはyytextの文字列すべてを入力ストリームに戻します。

例:[0-9]+ { yyless(0); }

マッチした文字列を、次にマッチする文字列と結合したい。

yymore()関数を使用します。yytext文字列に結合した文字列が入ります。

例:[0-9]+ { yymore(); }

デバッグ情報を標準エラーで出力したい。

flexのファイルに %option debug を設定します。次にyyset_debug()関数でデバッグ値を1に設定します。

flexファイル内で
例:%option debug

字句解析器を呼び出すプログラムで
例:
yyscan_t scanner;
yylex_init(&scanner);
yyset_debug(1,scanner);

字句解析器を標準入力ではなく、文字列から処理させたい。

yy_switch_to_buffer()関数とyy_scan_bytes()関数とを組み合わせて使用します。

例:
char buf[] = "1+2+3=\n";
yyscan_t scanner;
yylex_init(&scanner);
yy_switch_to_buffer( yy_scan_bytes(buf,sizeof(buf),scanner ), scanner );
目安箱バナー