%{
/*{{定型コード:lex.yy.l(定義部,%{〜%}内)=====================================*/
#ifdef  PIECE
#include "app.h"
#else //PIECE
#include "winapp.h"
#endif//PIECE
#include "y.tab.h"
/* 入力バッファサイズを定義します。
 * デフォルトでは16384と定義されており、P/ECEには大きすぎます。
 * P/ECEに適切な、小さなサイズ(256)に、再定義しました。
 * 入力バッファサイズが不足した場合は、自動的に拡張されるので、問題ありません。
 * 一つのトークンの大きさが、入力バッファサイズを超えたときに、拡張されるようです。
 */
#undef  YY_BUF_SIZE
#define YY_BUF_SIZE 256
/* 入力ファイルの行を数えるための変数を定義します。
 * 「%option yylineno」を指定して、行を数えるコードを自動生成することもできますが、
 * コンパイラが警告を出したりして煩わしくなるので、自分で数えることにしました。
 */
int yylineno;
/* スキャナの入力ファイルを初期化します。
 * yyparse()を実行する都度、その直前に、本関数を呼び出してください。
 */
void yylex_init(FILE* input_file) {
  if(!input_file) DIE();   /* 入力ファイルが指定されていなければエラー停止 */
  BEGIN INITIAL;           /* スタート状態を初期化します */
  yylineno = 1;            /* 入力ファイルの行を初期化します */
  yyrestart(input_file); } /* スキャナの実行を再開するようFlexに通知します */
/* 入力方法を変更するマクロを定義します。
 * lex.yy.c内で、デフォルトのYY_INPUT()よりも先に展開されるので、#undefは不要です。
 * 自作CLiPライブラリの標準入出力は、CRLFをLFに変換しないので、明示的に変換します。
 */
#define YY_INPUT(buf,result,max_size) {  \
  int i = 0; while(i < (max_size)) {     \
    int c = getc(yyin);                  \
    if(c == EOF)  { break; }             \
    if(c == '\r') { continue; }          \
    (buf)[i++] = c;                      \
    if(c == '\n') { yylineno++; break; } \
  } (result) = i; }
/*}}定型コード:lex.yy.l(定義部,%{〜%}内)=====================================*/
%}
/*{{定型コード:lex.yy.l(定義部,%{〜%}外)=====================================*/
/* Suppress the appearance of unneeded routines in the generated scanner. */
%option noinput
%option nounput
/* Make the scanner not call yywrap() upon an end-of-file, but simply assume that there are no more files to scan. */
%option noyywrap
/*}}定型コード:lex.yy.l(定義部,%{〜%}外)=====================================*/

%x COMMENT

%%

<INITIAL>{
"#"				{ BEGIN COMMENT; }

":"				|
","				|
"("				|
")"				|
"+"				|
"-"				|
"*"				|
"/"				|
"&"				|
"^"				|
"|"				|
"<<"				|
">>"				{ return yytext[0]; }

id(\(.*\))?			{ return T_ID; }	/* "id",又は,"id(ｺﾒﾝﾄ)" */

0|[1-9][[:digit:]]*		|
0(x|X)[[:xdigit:]]+		{ yylval.v_num = strtoul(yytext, NULL, 0); return T_NUM; }
"@@"				|	/* MASM的なローカルラベル。@B,又は,@Fで参照されるラベルを定義する。 */
"@B"				|	/* MASM的なローカルラベル。一つ前の@@を参照する。 */
"@F"				|	/* MASM的なローカルラベル。一つ後の@@を参照する。 */
\.[_[:alnum:]]+			|	/* NASM的なローカルラベル。グローバルラベル定義〜グローバルラベル定義の間でのローカルラベルとなる。「.」の後は数字で始まっても良い。「.」もラベルに含める。<例>「.Abc123」,「.123」 */
[_[:alpha:]][_[:alnum:]]*	{ yylval.v_lab = strdup(yytext); return T_LAB; }	/* 原則としてグローバルラベルは数字で始まってはいけない。C言語シンボルと同じ規則。<例>「Abc123」,「_123」 */
\`[_[:alnum:]]+			{ yylval.v_lab = strdup(yytext + 1); return T_LAB; }	/* ただし先行して「`」を書けば数字で始まっても良い。「`」はラベルに含めない。<例>「`Abc123」(Abc123と書くのと同じ),「`123」(123というラベルになる) */

[[:blank:]]+			{ /** no job **/ }
\n				{ return T_EOL; }
.				{ yyerror("scan error"); return yytext[0]; }
}

<COMMENT>{
\n				{ BEGIN INITIAL; return T_EOL; }
.				{ /** no job **/ }
}

%%
