/*****************************************************************************
 * Bison/Flexプログラム部分をテストするための、Windowsアプリケーションの雛型 *
 * □ビルド・実行方法:                                                       *
 * ┃"C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"  *
 * ┃make -f winapp.mk run                                                   *
 *****************************************************************************/
#ifndef __WINAPP_H__
#define __WINAPP_H__
/*{{定型コード:winapp.h======================================================*/
#include <clip.h>
/* y.tab.y */
extern int yynerrs;
#if     (YYDEBUG!=0)
extern int yydebug;
#endif/*(YYDEBUG!=0)*/
int yyparse();
void yyerror(const char* fmt, ...);
/* lex.yy.l */
extern FILE* yyin;
extern FILE* yyout;
extern int yylineno;
int yylex();
void yylex_init(FILE* input_file);
/* winapp.c */
void push_location(const char* path);
void pop_location();
/*}}定型コード:winapp.h======================================================*/
/*---------------------------------------------------------------------------*/
/* 構造体定義 */
typedef struct _ST_Table {
	struct _ST_LabelRow*	labelRow;
	struct _ST_Blocks*	blocks;
} ST_Table;
typedef struct _ST_Blocks {
	int			n;
	struct _ST_Block**	TBL_block/*[n]*/;
} ST_Blocks;
typedef struct _ST_Block {
	struct _ST_Header*	header;
	struct _ST_Body*	body;
} ST_Block;
typedef struct _ST_Header {
	int			n;
	struct _ST_HeaderRow**	TBL_headerRow/*[n]*/;
} ST_Header;
typedef struct _ST_Body {
	int			n;
	struct _ST_BodyRow**	TBL_bodyRow/*[n]*/;
} ST_Body;
typedef struct _ST_LabelRow {
	int			line;		//行番号。エラーメッセージのためだけに使用する。
	const char*		label;
} ST_LabelRow;
typedef struct _ST_HeaderRow {
	int			line;		//行番号。エラーメッセージのためだけに使用する。
	struct _ST_Values*	colIds;
} ST_HeaderRow;
typedef struct _ST_BodyRow {
	int			line;		//行番号。エラーメッセージのためだけに使用する。
	int			hitVal;
	struct _ST_ValRefs*	weights;
} ST_BodyRow;
typedef struct _ST_Values {
	int			n;
	int*			TBL_value/*[n]*/;	//値		(-1)=空白	colIdの場合のみ'(-1)=空白'に成り得ます。それ以外では空白は許容されずy.tab.yにてエラーとなります。
} ST_Values;
typedef struct _ST_ValRef {
	int			val;			//値
	const char*		ref;			//参照表現	NULL=無し	エクセルの参照表現文字列("'C:\Home\[Book1.xlsx]Sheet1'!A1",又は,"[Book1.xlsx]Sheet1!A1",又は,"Sheet1!A1",又は,"A1")を指定する事を想定しています。ただし当ツールは文字列の内容を意識しません。エクセルの参照表現文字列以外の任意の文字列を指定しても構いません。
} ST_ValRef;
typedef struct _ST_ValRefs {
	int			n;
	ST_ValRef*		TBL_valRef/*[n]*/;
} ST_ValRefs;
/*---------------------------------------------------------------------------*/
/* グローバル関数宣言 */
int cast_dbl_to_int(double d);
int cast_int_to_e10(int i);
int cast_dbl_to_e10(double d);
ST_Table* Table_newBlocks(ST_LabelRow* labelRow, ST_Blocks* blocks);
ST_Table* Table_newBody(ST_LabelRow* labelRow, ST_Body* body);
ST_Blocks* Blocks_add(ST_Blocks* blocks, ST_Block* block);
ST_Block* Block_new(ST_Header* header, ST_Body* body);
ST_Header* Header_add(ST_Header* header, ST_HeaderRow* headerRow);
ST_Body* Body_add(ST_Body* body, ST_BodyRow* bodyRow);
ST_LabelRow* LabelRow_new(const char* label);
ST_HeaderRow* HeaderRow_new(ST_Values* colIds);
ST_BodyRow* BodyRow_new(int hitVal, ST_ValRefs* weights);
ST_Values* Values_add(ST_Values* values, int value);
ST_ValRefs* ValRefs_add(ST_ValRefs* valRefs, ST_ValRef valRef);
int ColId_new(int num);
int HitVal_new(int num);
int Weight_new(int num);
const char* LabDef_new(const char* lab);
int LabRef_new(const char* lab);	//{{抽選表idを自己参照できるように。}}
void add_table(ST_Table* table);
/*---------------------------------------------------------------------------*/
/*--- 変更履歴 ---*/
// * Mon Feb 16 21:32:48 JST 2015 Naoyuki Sawa
// - 1st リリース。
// * Sat Feb 21 13:26:55 JST 2015 Naoyuki Sawa
// - 前バージョンでは、シフト還元衝突が起きていたのを見落としていました。
//   具体的には、allの「all eols」と、bodyRowの「hitVal ',' weights eols」が衝突していました。
//   前者を「eols」に変更して修正しました。
// - colId,hitVal,weightに、抽選表idを自己参照できるようにしました。
//   そのために、labelRowは先頭に':'を必要とするよう、文法を変更しました。
//   labelRowを明示する方法が無いと、bodyRowの継続とlabelRowを区別できず、シフト還元衝突が発生するからです。
//   本当は「labelRow : T_LAB ':' T_EOL」にしたいのですが、これではT_LABを読んだ時点でシフト還元衝突します。
//   仕方無く「labelRow : ':' T_LAB T_EOL」にしました。DOSのバッチっぽい書き方なので不自然ではないでしよう。
// - 当ツール自身が抽選表idを扱うようになったので、「clip/tool/MkLotTblNo.awk,MkLotTblNo.bat」は不要になりました。
//   もう、MkLotTblNo.awk,MkLotTblNo.batは不要なのですが、これまで安定して動作していたので、
//   今後の参考のために、「clip/keep/12_MkLotTblNo_bat_MkLotTblNo_awk_削除前保存.20150221」に保存しておきました。
// * Sun Feb 22 10:11:58 JST 2015 Naoyuki Sawa
// - '-o'オプションを追加しました。
//   これまでは、バイナリデータが必要な場合、Cソース形式で出力してからCSrc2Rom.bat等でバイナリ変換していましたが、
//   今後は、当ツールから直接バイナリデータを出力することが出来るようになりました。
// - これまで、1パス目でセマンティクスエラーが発生した時に、継続せずに終了してしまっていました。
//   1パス目の処理を修正し、致命的なエラーが発生した場合(yyparse()!=0)のみ、処理を打ち切るように修正しました。
//   セマンティクスエラー(yynerrs!=0)だけならば、全てのセマンティクスエラーを報告するために、処理を継続します。
// * Sun Mar 01 22:44:33 JST 2015 Naoyuki Sawa
// - 最適化のバグを修正しました。
//   前回のバージョンまでは、最適化処理にてTBL_TableData[]をmemcmp()する比較サイズをsizeof(uint16_t)倍するのを忘れていて、一致しないテーブルデータまで一致と見なして最適化してしまっていました。
//   今回のバージョンで上記を修正し、sizeof(uint16_t)倍するようにして、正しく比較するようになりました。
// - 先行して「`」を書くと数字で始められるラベル定義方法，'@'ローカルラベル，'.'ローカルラベルを対応しました。
//   これらの仕様は他のツール(dDirSeqC.exe等)と同じですので、それらのコメントを参照してください。
// - ローカルラベルの使用方法としては、抽選表の当選値や重み値に抽選表idを入れる時に、それらの抽選表idをローカルラベルとして定義する事が出来ます。
//   こうすると、大分類/小分類の抽選表を作成する時に、小分類の抽選表の名前を短くする事ができます。
//   大分類a,小分類a1,小分類a2,小分類a3,大分類b,小分類b1,小分類b2,小分類b3の順で抽選表を定義すれば、小分類の抽選表をローカルラベルとする事で、名前が被っていても良く、名前を短く出来るからです。
// - ローカルラベルは#defineには出力されませんが、LotTblNo_Maxの数には含まれ、アドレステーブルにも出力される事に注意してください。
//   詳しくは、output()の「アドレステーブルを出力する。」の部分のコメントを参照してください。
// * Mon Mar 02 21:47:20 JST 2015 Naoyuki Sawa
// - TBL_LotTblNo[0]に(LotTblNo_Max+1)を格納するようにしました。
//   アプリケーションは「TBL_LotTbl=&TBL_LotTblNo[TBL_LotTblNo[0]]」でデータの先頭位置を求められるようになりました。
//   ヘッダファイルを見なくてもバイナリだけを見て処理できるようにするためです。
//   尚、LotTblNo_Maxの定義もこれまで通りヘッダファイルに出力していますので、LotTblNo_Maxもこれまで通り使用可能です。
//   LotTblNo_Maxを使ってデータの先頭位置を求める場合は「TBL_LotTbl=&TBL_LotTblNo[(LotTblNo_Max+1)]」としてください。
// * Fri Mar 06 21:00:56 JST 2015 Naoyuki Sawa
// - '-e'オプションを追加しました。
//   標準エラー出力をリダイレクトすると、進捗表示と混ざって見づらかったので、ログファイルを生成できるようにしました。
// * Sun Mar 15 21:44:53 JST 2015 Naoyuki Sawa
// - 当選値を昇順にソートして出力する事にしました。変更箇所はpass2()の中です。変更理由は以下の通りです。
//   抽選表の行が極端に多い場合に、LOT_get_column_weight(),及び,それを呼び出す各関数の実行時間が極端に長くなる問題が生じました。
//   問題を回避するために、LOT_get_column_weight()をリニアサーチ⇒バイナリサーチに変更しました。
//   LOT_get_column_weight()がバイナリサーチを行うために、当選値が昇順に並んでいる必要が有るので、当ツールの処理も変更しました。
// - 当選値が重複していたらエラーとする事にしました。変更箇所はpass2()の中です。変更理由は以下の通りです。
//   これまで、当選値が重複していても、エラーも警告も発する事は無くそのまま出力していました。
//   当選値が重複していても処理上の問題は無く、LOT_draw_column()は行の順に処理するだけですし、LOT_get_column_weight()は同じ当選値の先に現れた行を参照するだけだからです。
//   しかし実際には、当選値が重複している抽選表は、入力バグである可能性が高く、早めに検出しておく方が良いと思ったからです。
//   LOT_draw_column()やLOT_get_column_weight()の処理上は当選値が重複していても問題無いのですが、敢えて、重複した当選値をエラーとして検出する事にしました。
// - '-i'オプションを追加しました。上記を警告に留めエラーとしません。
//   意図的に重複した当選値の行を含む抽選表を変換する場合は、'-i'オプションを指定してください。
//   ただし、重複した当選値の行を含む抽選表に対してLOT_get_column_weight()を使用すると、間違った結果になる危険が高いので注意してください。
//   例えば、(当選値1,重み値2)の列と、(当選値1,重み値3)の行が有り、後者に当選した場合に、LOT_get_column_weight(当選値1)を行うと、どちらの重み値が返されるかが判らないからです。
// * Mon Mar 16 21:19:10 JST 2015 Naoyuki Sawa
// - '抽選表idの自己参照を解決する処理'を、'抽選列idの重複チェック','当選値を昇順にソート','当選値の重複チェック'より先に行うように修正しました。
//   これまでは、それらよりも後で行っていたため、'抽選表idの自己参照を解決した結果'が'値で指定された抽選列id'に偶然一致した場合に、重複エラーを検出できないというバグが有りました。
//   また、当選値として'抽選表idの自己参照'を使用していた場合に、当選値を昇順にソートした結果が不正になるというバグが有りました。
//   いずれのバグも、抽選列idや当選値として'抽選表idの自己参照'を使用した場合のみ顕在化するバグであり、実際に問題が出た事は無かったのですが、バグはバグなので修正する事にしました。
// * Tue Mar 24 21:58:56 JST 2015 Naoyuki Sawa
// - Weight_new()のエラーメッセージが間違っていたので修正しました。
// * Sat Oct 10 21:13:38 JST 2015 Naoyuki Sawa
// - '~'演算子を対応しました。
// * Thu Oct 15 21:01:52 JST 2015 Naoyuki Sawa
// - '-n'オプションを追加しました。
// - 「Foo10」「Foo50」「Foo100」「Foo300」のような抽選表ラベルを定義した時に、これまでは「Foo10」「Foo100」「Foo300」「Foo50」の順に抽選表idが振られてしまう問題が有りました。
//   '-n'オプションを指定すると、「Foo10」「Foo50」「Foo100」「Foo300」の順に抽選表idが振られるようになりました。
// - '-n'オプションを指定しなければ、これまでと同じ順序になります。
//   もし古いバージョンのツールで出力した抽選表idの順序に依存している場合は、'-n'オプションを指定しないようにして下さい。
// - !!注意点!!
//   一般的には、'-n'オプションを指定する方が良いと思いますが、ラベル名の付け方によっては、'-n'オプションを指定しない方が良いケースも有ります。
//   例えば、英数字○桁固定でラベル名を付けている場合などです。
//   「12345」「1234A」「123AB」という抽選表ラベルを定義した場合、「12345」「1234A」「123AB」の順に抽選表idが振られるのが望ましいです。
//   しかし、'-n'オプションを指定すると、「123AB」「1234A」「12345」の順に抽選表idが振られてしまいます。
//   この場合、'-n'オプションを指定しなければ、これまで通り「12345」「1234A」「123AB」の順に抽選表idが振られます。
//   '-n'オプションを指定する方が良いか指定しない方が良いかは、アプリケーション毎のラベル命名規約によって判断して下さい。
// * Fri Oct 16 21:16:43 JST 2015 Naoyuki Sawa
// - clipstr.hのstrnatcmp(),strnatcasecmp()の動作を変更した事に伴い、当ツールをリビルドしました。
//   上記の関数の動作変更は、当ツールの使用方法では影響無いのですが、念のためにリビルドする事にしました。
// * Sat Nov 14 21:55:38 JST 2015 Naoyuki Sawa
// - 「Boehm GC」をマルチスレッド対応にした事,及び,それに伴ってclipbpe.cモジュールを修正した事に伴い、当ツールもプロジェクト設定の変更を行ってリビルドしました。
//   詳細は、/clip/tool/gc/README.TXT と /clip/clipbpe.c の2015/11/03のコメントを参照して下さい。
// - ゼロ除算エラーと、範囲外ビットシフトのハンドリングを追加しました。
//   これまでは前者はCPU例外で終了し、後者は無視してしまっていました。今後はエラーと見なします。
// - '%'演算子を対応しました。
// * Sun Nov 22 21:02:41 JST 2015 Naoyuki Sawa
// - 環境変数'プログラム名_OPTION'で指定されたオプション(有れば)を、コマンドライン引数にマージするようにしました。
//   詳細は、/clip/clipmisc.c の同日のコメントを参照して下さい。
// - GCに'-DLARGE_CONFIG'を付けてリビルドした事に伴い、当アプリケーションもリビルドしました。
//   詳細は、/clip/tool/gc/README.TXT の同日のコメントを参照して下さい。
// * Sat Jan 02 21:26:28 JST 2016 Naoyuki Sawa
// - '<<','>>'と'<','>'に対して、これまでlex.yy.lがどちらも'<','>'を返していましたが、前者についてはT_SHL,T_SHRを返すようにして区別しました。
//   詳細は、/clip/tool/dPrpTblC/winapp.h の2015/12/27のコメントを参照して下さい。
// * Sun Jan 03 21:17:56 JST 2016 Naoyuki Sawa
// - プレフィクス文字列を固定にしました。
//   これまで使って来てプレフィクス文字列を変更する必要性が無く、毎回'-p'オプションを指定する事が却って手間になる事が判ったからです。
//   この変更に伴い、'-p'オプションを廃止しました。
// * Sun Feb 21 21:02:01 JST 2016 Naoyuki Sawa
// - libclipのライブラリ化の伴い、以下の変更を行いました。
//   ・extclip.hとextclip.cを削除しました。extclip.hとextclip.cはlibclipに含まれるようになったからです。
//   ・"CLiP Files"を削除しました。CLiPライブラリの各モジュールはlibclipに含まれるようになったからです。
//   当ツールの動作には変更有りません。
// * Tue Mar 01 21:34:55 JST 2016 Naoyuki Sawa
// - clipstd.hにてC4131の警告レベルを引き上げましたが、Bison/Flexの生成コードには旧スタイルの宣言が使われているので、Bison/Flexの生成コードのみ警告レベルを元に戻しました。
// * Sun Apr 24 21:05:43 JST 2016 Naoyuki Sawa
// - 2016/04/23に、/clip/clipstd.hにparsonとLibYAMLのインクルードを追加した事に伴い、当プロジェクトにもparsonとLibYAMLのインクルードパスとライブラリパスの設定を追加しました。
//   当プロジェクトはparsonもLibYAMLも使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
// - libclip.lib,gc.lib,pthreadVC2(d).lib,sqlite.lib,pdcurses.libのリンク指定を、/clip/libclip/extclip.hで指定するようにし、個別のアプリケーション設定からは削除しました。
//   parson.lib,yaml.libのリンク指定を、/clip/clipstd.hで指定するようにし、個別のアプリケーション設定からは削除しました。
// * Mon Apr 25 22:45:55 JST 2016 Naoyuki Sawa
// - 実数の計算式に対応しました。
//   暗黙の型変換のルールは、C言語と同じです。
//   キャスト演算子は、'(int)'と'(double)'のみ対応しています。
// - あくまでも途中計算で実数の計算式が使えるだけであり、最終的には整数にキャストする必要が有る事に注意して下さい。
//   例は、/clip/tool/dTexDefC/winapp.hの同日のコメントを参照して下さい。
// * Tue Apr 26 22:39:26 JST 2016 Naoyuki Sawa
// - 実数の計算式から、整数引数への、暗黙の型変換を対応しました。
//   '-w'オプションを指定しなければ、C言語と同様に、警告無しで処理します。
//   '-w'オプション,又は,'-wcast'オプションを指定すると、暗黙の型変換によって誤差が発生した時のみ警告を表示し、最終的にエラー終了します。
//   C言語と違って、誤差が発生しなかった時は警告を表示しない事に注意して下さい。
// - 上記の変更のために、'-w'オプションを処理する仕組みとして、getsubopt()を導入しました。
//   今後、他の種類の警告を追加する時は、この仕組みを使って警告を追加出来ます。
// * Thu Jun 09 21:26:53 JST 2016 Naoyuki Sawa
// - lex.yy.lにて、数値(T_NUM)の解析を、既存の10進数と16進数に加えて、新しく8進数と2進数も解析出来るようにしました。
// * Sat Jul 02 21:34:21 JST 2016 Naoyuki Sawa
// - 2016/06/14に、/clip/clipstd.hに'#pragma comment(lib, "liblua.lib")'を追加した事に伴い、当プロジェクトにもlibluaのライブラリパスの設定を追加しました。
//   現在の所、当プロジェクトはlibluaを使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
//   尚、libluaのインクルードパスは以前から設定していたので、今回、追加したのはlibluaのライブラリパスのみです。
// - 2016/07/01に、/clip/libclip/extclip.hに'#include <sqlite3.h>'と'#pragma comment(lib, "sqlite3.lib")'を追加した事に伴い、当プロジェクトにもsqlite3のインクルードパスとライブラリパスの設定を追加しました。
//   現在の所、当プロジェクトはsqlite3を使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
// * Sun Jul 10 11:29:13 JST 2016 Naoyuki Sawa
// - y.tab.yのint_argの文法規則の最後に、「;」が抜けていたミスを修正しました。
//   bison.exeはこのような単純なミスを自動的に補ってくれるので、bison.exeのエラーにもならず、生成したプログラムの動作上も問題無く、これまで気付きませんでした。
//   しかし、間違った記述であった事には違い無いので、修正しておく事にしました。
// - lex.yy.lが返す文字列を、これまではstrdup()していたのを、intern_string()に変更しました。
//   メモリ節約のためだけであり、結果はこれまでと変わりません。
// - '-c'オプションを追加しました。
//   詳細は、winapp.cのpass2()内の「クロスリファレンス出力処理」のコメントを参照して下さい。
// * Sun Jul 17 21:03:07 JST 2016 Naoyuki Sawa
// - クロスリファレンスの出力書式を、「ラベル名 (タブ) 参照表現 (タブ) 当選値 [ (タブ) 抽選列id [ (タブ) 抽選列id ... ] ]」⇒「参照表現 (タブ) ラベル名 (タブ) 当選値 [ (タブ) 抽選列id [ (タブ) 抽選列id ... ] ]」に変更しました。
//   この順序の方が、読み易いと思ったからです。
// * Mon Jul 18 20:14:53 JST 2016 Naoyuki Sawa
// - クロスリファレンスの出力書式を、「参照表現 (タブ) ラベル名 (タブ) 当選値 [ (タブ) 抽選列id [ (タブ) 抽選列id ... ] ]」⇒「参照表現 (タブ) 抽選表id (タブ) 当選値 [ (タブ) 抽選列id [ (タブ) 抽選列id ... ] ]」に変更しました。
//   テーブルの識別子をラベル名のままで出力するよりも、抽選表idとして出力する方が、クロスリファレンスと抽選ログを突き合わせて処理する時に手間が省けて処理し易いと思ったからです。
// * Sat Aug 20 21:19:11 JST 2016 Naoyuki Sawa
// - キャスト演算子'(exp10)'を追加しました。
//   定数表の抽選値に、大きな値を埋め込んで、LOT_get_table_weight_l()等で取得して利用する事が出来るようになりました。
//   詳細は、cliplot.hの「16ビットで大きな値を表現するための、指数表現」の、同日のコメントを参照して下さい。
// - キャスト演算子'(exp10)'は、主に、抽選値(重み)に対して使用する事を想定していますが、当選値や抽選列idに対して使用する事も可能ではあります。
//   抽選列idに対して使用した場合は(無いとは思いますが…)、アプリケーション側でExp10_Encode()で変換した値を、LOT_get_table_weight_l()等の抽選値idに指定する必要が有る事に注意して下さい。
// - キャスト演算子'(exp10)'の結果は、exprではありません。
//   従って、キャスト演算子'(exp10)'の結果に対して、演算を行ったり、(～)で囲ったりする事は出来ない事に注意して下さい。
//   <例>
//   │(exp10)1+2	… ok。'((exp10)1)+2'ではなく、'(exp10)(1+2)'と解釈される事に注意して下さい。'+'よりも'(exp10)'の優先度が高いにもかかわらず、'1+2'の方が先に結合する理由は、'(exp10)1'の結果はexprではないからです。
//   │((exp10)1)+2	… エラー。
//   │((exp10)1)	… エラー。
// * Sat Aug 20 23:46:20 JST 2016 Naoyuki Sawa
// - テーブル全体の抽選値(weight)を自動的に指数表現として格納するための、簡略記法を追加しました。
//   <例>
//   │#//①これまでの書き方
//   │:Prize1
//   │   id,                1,                2,                3
//   │50001,(exp10)      1001,(exp10)      1002,(exp10)      1002
//   │50002,(exp10)   1001000,(exp10)   1002000,(exp10)   1003000
//   │50003,(exp10)1001000000,(exp10)1002000000,(exp10)1003000000
//   │#//②簡略記法を使った書き方
//   │:(exp10)Prize2
//   │   id,         1,         2,         3
//   │50001,      1001,      1002,      1002
//   │50002,   1001000,   1002000,   1003000
//   │50003,1001000000,1002000000,1003000000
//   ①と②の結果は全く同じになります。
// - 今回追加した簡略記法で、自動的に指数表現に変換される対象となるのは、抽選値(weight)だけである事に注意して下さい。
//   当選値(hitVal)や抽選列id(column_id)は、そのままの値で格納されます。
//   当選値(hitVal)や抽選列id(column_id)を指数表現で格納したい場合は(無いとは思いますが…)、簡略記法を指定したテーブルの中であっても、当選値(hitVal)や抽選列id(column_id)に対しては明示的に'(exp10)'を指定する必要が有ります。
//   <例>
//   │:(exp10)Prize2
//   │          id,  (exp10)1,  (exp10)2,  (exp10)3
//   │(exp10)10001,      1001,      1002,      1002
//   │(exp10)10002,   1001000,   1002000,   1003000
//   │(exp10)10003,1001000000,1002000000,1003000000
// * Sun Aug 21 21:04:02 JST 2016 Naoyuki Sawa
// - テーブル全体の抽選値(weight)に対して、自動的に特定の整数値を掛けるための、簡略記法を追加しました。
//   主な目的は、乱数分母256のテーブルを、乱数分母65536のテーブルに変換する場合の、手間を省くためです。
//   │#//①これまでの書き方
//   │:Test1
//   │   id,      1,      2
//   │50001,128*256,192*256
//   │50002, 96*256, 64*256
//   │50003, 32*256,  0*256
//   │#//②簡略記法を使った書き方
//   │:Test2 * 256
//   │   id,  1,  2
//   │50001,128,192
//   │50002, 96, 64
//   │50003, 32,  0
// - 指数表現と併用する事も出来ます。
//   下記のテーブルは、全て同じ結果になります。
//   <例>
//   │:Test1
//   │   id,               1,                2
//   │50001,(exp10)123*10000,(exp10)1234*10000
//   │50002,(exp10)456*10000,(exp10)5678*10000
//   │50003,(exp10)789*10000,(exp10)9012*10000
//   │:(exp10)Test2
//   │   id,        1,         2
//   │50001,123*10000,1234*10000
//   │50002,456*10000,5678*10000
//   │50003,789*10000,9012*10000
//   │:Test3 * 10000
//   │   id,         1,          2
//   │50001,(exp10)123,(exp10)1234
//   │50002,(exp10)456,(exp10)5678
//   │50003,(exp10)789,(exp10)9012
//   │:(exp10)Test4 * 10000
//   │   id,  1,   2
//   │50001,123,1234
//   │50002,456,5678
//   │50003,789,9012
// - 元の値が小数の場合に、乗算が行われる順序によって違いが生じるケースが有り、注意が必要です。
//   詳細は、y.tab.yの「static int nTblMul;」定義箇所のコメントを参照して下さい。
// * Fri Sep 16 21:30:10 JST 2016 Naoyuki Sawa
// - '-q'オプションを追加しました。
//   /clip/test.win/を元にしたプロジェクトで、VC++6.0のカスタムビルドから呼び出された場合に、'\r'による同じ行の重ね書きが上手く認識されず、VC++6.0の出力ペインに進捗表示が多く出過ぎて、その他の重要なエラーが見づらくなってしまう問題を避けるためです。
//   基本的には、VC++6.0のカスタムビルドから呼び出す場合だけに'-q'オプションを使用し、コマンドラインから呼び出す場合はこれまで通り'-q'オプションは指定しなくて構いません。
// * Wed Sep 21 21:20:16 JST 2016 Naoyuki Sawa
// - die(～)で終了していた箇所を、error(EXIT_FAILURE,～)で終了するように変更しました。
//   変更した理由は、以下の通りです。
// - die()は、標準エラー出力がコンソールでなければ、エラーメッセージをメッセージボックスで表示します。
//   通常はそれが望ましい動作なのですが、VC++6.0やVS2015のカスタムビルドとして当ツールを呼び出した場合に、使い辛い問題が生じます。
//   VC++6.0やVS2015は、カスタムビルドとして呼び出すツールの標準エラー出力をリダイレクトして、アウトプットウインドウに表示します。
//   標準エラー出力がコンソールでないので、当ツールはエラー終了する場合に、メッセージボックスを表示します。
//   結果として、カスタムビルドとして呼び出したツールがエラーになると、いちいちメッセージボックスを表示して停止し、使い辛い問題が生じました。
//   元々、die()が標準エラー出力がコンソールでなければエラーメッセージをメッセージボックスで表示するようにした理由は、コマンドプロンプトを持たないウインドウアプリケーションのためであり、
//   当ツールのようなコンソールアプリケーションの標準エラー出力がリダイレクトされた場合にメッセージボックスを表示する必要はあまり有りません。
//   そこで、当ツールがエラー終了する時にdie()を呼び出すのをやめて、error()で終了するように変更する事にしました。
// * Sun Sep 25 21:05:26 JST 2016 Naoyuki Sawa
// - /clip/test.win/lex.yy.lの'popen'対応処理を、当ツールのlex.yy.lにマージしました。
//   当ツールの'popen'対応は必須ではないのですが、本日dFsmMapC.exeに上記の変更を行ったついでに当ツールも対応しておく事にしました。
// - エラーメッセージに、現在の行番号だけでなく、現在のファイル名も表示するようにしました。
//   エラーメッセージの形式は、VC++6.0に合わせて、「ファイル名(行番号) : エラーメッセージ」としました。
// * Wed Sep 28 21:26:44 JST 2016 Naoyuki Sawa
// - error()の文字列の最後に余計な改行が付いていたのを削除しました。
//   error()は指定された文字列の後に(もし有ればエラー名を挟んで)自動的に改行を出力するので、アプリケーション側で文字列の最後に改行を付けると、文字列とエラー名の間に余計な改行が出力されたり、二回改行してしまう問題が生じていました。
// * Sun Oct 02 21:48:17 JST 2016 Naoyuki Sawa
// - ";"によるマルチステートメントに対応しました。
//   変更箇所は、lex.yy.lの「\n { return T_EOL; }」の上の行に、「";" |」を追加しただけです。
// - マルチステートメント対応が必要になった理由は、主にdDirSeqC.exeのためです。
//   Cプリプロセッサで一つのマクロで複数のact命令を生成する時に、Cプリプロセッサの制限のために複数行に分けられないからです。
//   今回マルチステートメントを対応した事によって、「act ～; act ～; act ～」のように一行で複数のact命令が可能になりました。
//   dDirSeqC.exe以外のツールについては、今すぐにマルチステートメント対応が必要な訳ではないのですが、上述の通り変更箇所は少ないので、他のツールも一緒に変更しておく事にしました。
/* バージョン定義 */
#define VERSION "20161002"
/*---------------------------------------------------------------------------*/
#endif/*__WINAPP_H__*/
