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 );