%{
/*{{定型コード: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]; }

"def"				{ return T_DEF; }
"end"				{ return T_END; }
"goto"				{ return T_GOTO; }
"call"				{ return T_CALL; }
"repeat"			{ return T_REPEAT; }
"speed"				{ return T_SPEED; }
"move"				{ return T_MOVE; }
"wait"				{ return T_WAIT; }
"init"				{ return T_INIT; }
"stop"				{ return T_STOP; }
"rel"				{ return T_REL; }
"abs"				{ return T_ABS; }
"user"				{ return T_USER; }

(0|[1-9][[:digit:]]*)		{ yylval.v_num = atoi(yytext);   return T_NUM; }
[_[:alpha:]][_[:alnum:]]*	{ yylval.v_lab = strdup(yytext); return T_LAB; }

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

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

%%
