他言語に対応する (Delphi, PL/SQL, T-SQL)

Delphi用に処理を変更しなければいけないのは、
・「(*」〜「*)」は複数行コメント
・「{」〜「}」は複数行コメント
・「'」〜「'」は文字列
・「{$」〜「}」はコンパイラ指令
・8進表記はない
・16進表記は「$」ではじまる
・整数定数を「#」〜であらわす (たとえば、改行コードは、#13#10)
など。

PL/SQL用に処理を変更しなければいけないのは、
・「--」〜は単一行コメント
・「'」〜「'」は文字列
・「"」〜「"」は識別子
など。

T-SQL用に処理を変更しなければいけないのは、
・「--」〜は単一行コメント
・「'」〜「'」は文字列
・「"」〜「"」は識別子
・「[」〜「]」は識別子
など。

SourceToHtml016.js


//******************************************************************************
// C++, C#, Java, JavaScript, VB, Delphi, PL/SQL, T-SQL → HTML 変換処理
//******************************************************************************
// 変換対象文字
var _escapeChar = "<>&()|";

// 強調表示するか?
var fKeyword = true; // 予約語
var fDirective = true; // ディレクティブ
var fComment = true; // コメント
var fIdent = false; // 識別子
var fString = false; // 文字列
var fChar = false; // 文字
var fNumber = false; // 数字
var fDelim = false; // 記号

// ファイルアクセス用オブジェクト
var _fs;

//入力ファイル名
var _inFileName = "";
// 出力ファイル名
var _outFileName = "";
// 雛形ファイル名
var _tempFileName = ".\\application\\template.html";

// 変換用オブジェクト
var _convert = new Object();
//*****************************************************************************
// 主処理 --- 各処理の呼び出し
//*****************************************************************************
main();

function main()
{
// 初期処理 --- コマンド引数の取得など、各変数の初期化
if (!initialize()) return;

// 雛形ファイルを 読み込み専用モードで 開く
var tsTemp = _fs.OpenTextFile(_tempFileName, 1);

// 出力ファイルを 新規作成モードで 開く
var tsOut = _fs.OpenTextFile(_outFileName, 2, -1);

// 雛形ファイルの終わりまで繰り返す
while (!tsTemp.AtEndOfStream)
{
// 雛形ファイルを 1行ずつ読む
var text = tsTemp.ReadLine();

// 入力ファイル名 を 出力
if (text.indexOf("%入力ファイル名%") >= 0)
tsOut.WriteLine(text.replace("%入力ファイル名%", _fs.GetFileName(_inFileName)));

// 行番号 を 出力
else if (text == "%行番号%")
putLineNo(tsOut);

// プログラムソース を 出力
else if (text == "%プログラムソース%")
SourceToHtml(tsOut);

// 雛形ファイルを そのまま出力
else
tsOut.WriteLine(text);
}

// 出力ファイルを 閉じる
tsOut.Close();

// 雛形ファイルを 閉じる
tsTemp.Close();
}
//*****************************************************************************
// 初期処理 --- コマンド引数の取得など、各変数の初期化
//*****************************************************************************
function initialize()
{
// コマンド引数が、2つ指定されてなければ、異常終了
if (WScript.Arguments.length < 2)
{
WScript.echo("コマンド引数が、2つ指定されてないので、終了");
return false;
}

//入力ファイル名を 取得する
_inFileName = WScript.Arguments(0);

// 出力ファイル名を 取得する
_outFileName = WScript.Arguments(1);

// FileSystemObject を 生成する
_fs = WScript.CreateObject("Scripting.FileSystemObject");

// 言語タイプを 取得する
getLangType();

// 言語タイプに応じて、変換用オブジェクトを設定する
setConvertOption();

// 予約語一覧を取得する
getKeywordList();

return true;
}
//=============================================================================
// 言語タイプを 取得する
//=============================================================================
function getLangType()
{
// 引数省略時は、"Text" として扱う
_convert.langType = "txt";

// 言語タイプを 取得する
if (WScript.Arguments.length > 2)
_convert.langType = WScript.Arguments(2).toLowerCase();

// 言語タイプを チェックする
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
break;

// 上記以外は、"Text" として扱う
default:
_convert.langType = "txt";
break;
}
}
//=============================================================================
// 言語タイプに応じて、変換用オブジェクトを設定する
//=============================================================================
function setConvertOption()
{
//-------------------------------------------------------------------------
// 大文字・小文字を区別する/しない
//-------------------------------------------------------------------------
switch(_convert.langType)
{
// 大文字・小文字を区別する
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.ignoreCase = false; // 大文字・小文字を区別する
_convert.getKeyword = getKeywordCase; // 予約語を返す
break;

// 上記以外は、大文字・小文字を区別しない
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
default:
_convert.ignoreCase = true; // 大文字・小文字を区別しない
_convert.getKeyword = getKeywordIgnoreCase; // 予約語を返す
break;
}

//-------------------------------------------------------------------------
// 日本語の使用を許可する/しない
//-------------------------------------------------------------------------
switch(_convert.langType)
{
// 日本語の使用を許可する
case "cs7": // Visual C#.NET
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.useMultiByte = true; // 日本語の使用を許可する
break;

// 上記以外は、日本語の使用を許可しない
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "del": // Delphi
default:
_convert.useMultiByte = false; // 日本語の使用を許可しない
break;
}

//-------------------------------------------------------------------------
// 変換用 主処理の 割り当て
//-------------------------------------------------------------------------
if (_convert.langType == "txt")
// テキストなら、文字のエスケ−プだけ
_convert.ConvToHtml = ConvToHtmlText;
else
// それ以外なら変換処理を行う
_convert.ConvToHtml = ConvToHtmlOther;

//-------------------------------------------------------------------------
// トークンの開始を 判定
//-------------------------------------------------------------------------
_convert.state = new Object();
_convert.state.waitStart = new Array();

// ディレクティブか?
var idx = 0;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
// case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#[A-Za-z]+/)); }; // #
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{\$.*\}/)); }; // {$ }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "ディレクティブ";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 単一行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\/.*$/)); }; // //
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'.*$/)); }; // '
break;
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^--.*$/)); }; // --
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\*.*\*\//)); }; // /* */
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\(\*.*\*\)/)); }; // (* *)
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{.*\}/)); }; // { }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントの 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\*.*$/)); }; // /*
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\*\//)); }; // */
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\(\*.*$/)); }; // (*
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\*\)/)); }; // *)
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 複数行コメントの 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{.*$/)); }; // {
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\}/)); }; // }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"([^"\\]|\\.)*("|$)/)); }; // " \" "
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"(""|[^"])*("|$)/)); }; // " "" "
break;
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'(''|[^'])*('|$)/)); }; // ' '' '
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'([^'\\]|\\.)*('|$)/)); }; // ' \' '
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 文字か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
// case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'([^'\\]|\\.)*('|$)/)); }; // ' \' '
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#(\$[0-9A-F]|[0-9])+/i)); }; // #$FF #99
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 逐語的文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^@"(""|[^"])*"/)); }; // @" "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 逐語的文字列の 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^@"(""|[^"])*$/)); }; // @" ""
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^(""|[^"])*"/)); }; // "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[A-Za-z_][A-Za-z0-9_]*/)); }; // _z9
break;
case "psql": // PL/SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[A-Za-z][A-Za-z0-9_#$]*/)); }; // z9$#
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 8進か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^0[0-7]+[A-Z]{0,2}/i)); }; // 07
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^&O[0-7]+[A-Z]{0,2}/i)); }; // &o7
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 16進か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^0X[0-9A-F]+[A-Z]{0,2}/i)); }; // 0xff
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^&H[0-9A-F]+[A-Z]{0,2}/i)); }; // &hff
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\$[0-9A-F]+/i)); }; // $ff
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99e99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+\.?[0-9]?e{1}[+-]?[0-9]*[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99.99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+\.[0-9]*[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 正規表現か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/(\\\/|[^\/])*\//)); }; // / \/ /
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 日付か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#[^'"]+#/)); }; // # #
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// エスケープされた識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\[.+(\]|$)/)); }; // [ ]
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";


// エスケープされた識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"(""|[^"])*("|$)/)); }; // " "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 記号か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[!"#$%&'\(\)*+,-./:;<=>?@\[\\\]^_`\{|\}~]/)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "記号";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 空白か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\s+/)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "空白";
_convert.state.waitStart[idx].nextState = "開始待ち";
}
//=============================================================================
// 予約語一覧を取得する
//=============================================================================
function getKeywordList()
{
// 予約語一覧
_convert.keyword = new Object();

// 予約語一覧ファイル名
var keyFileName = ".\\application\\" + _convert.langType + ".key";

if (_fs.FileExists(keyFileName))
{
// 予約語一覧ファイルを 読み込み専用モードで 開く
var tsKeyword = _fs.OpenTextFile(keyFileName, 1);
while (!tsKeyword.AtEndOfStream)
{
var s = tsKeyword.ReadLine();

// 大文字・小文字を区別しない → 予約語を小文字に変換して登録する
if (_convert.ignoreCase) _convert.keyword[s.toLowerCase()] = s;
// 大文字・小文字を区別する → 予約語をそのまま登録する
else _convert.keyword[s] = s;
}
tsKeyword.Close();
}
}
//-----------------------------------------------------------------------------
// 予約語か? (大文字・小文字を区別する)
//-----------------------------------------------------------------------------
function getKeywordCase(arg)
{
// 予約語一覧に登録されていれば、予約語を返す
return (_convert.keyword[arg]);
}
//-----------------------------------------------------------------------------
// 予約語か? (大文字・小文字を区別しない)
//-----------------------------------------------------------------------------
function getKeywordIgnoreCase(arg)
{
// 予約語一覧に登録されていれば、予約語を返す
return (_convert.keyword[arg.toLowerCase()]);
}
//*****************************************************************************
// プログラムソース を 出力
//*****************************************************************************
function SourceToHtml(tsOut)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = _fs.OpenTextFile(_inFileName, 1);

// 文脈オブジェクト
var context = new Object();

//現在の状態
context.state = "開始待ち";

// 入力ファイルの終わりまで繰り返す
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを 1行ずつ読む
context.value = tsIn.ReadLine();

// TAB を 空白に 変換
context.value = TabToSpace(context.value);

// プログラムソース を 変換して 出力
tsOut.WriteLine(_convert.ConvToHtml(context));
}
// 入力ファイルを 閉じる
tsIn.Close();
}
//=============================================================================
// テキスト を 変換して返す (文字のエスケ−プだけ)
//=============================================================================
function ConvToHtmlText(context)
{
return tokenToHtml(context.value, "");
}
//=============================================================================
// プログラムソース を 変換して返す
//=============================================================================
function ConvToHtmlOther(context)
{
// 変換出力用文字列
var lineOut = "";

// トークンを退避
var prevToken = "";
var prevType = "";

// トークンの種類を クリア
if (context.state == "開始待ち")
context.type = "";
// トークンを クリア
context.token = "";

while (context.value.length > 0)
{
if (context.state == "開始待ち")
{
var isMatch = false;

for (var i=0;i<_convert.state.waitStart.length;i++)
{
// トークンの種類を判定
if (_convert.state.waitStart[i].getToken(context.value))
{
context.token = RegExp.lastMatch;
context.type = _convert.state.waitStart[i].currType;
context.state = _convert.state.waitStart[i].nextState;
context.value = RegExp.rightContext;
isMatch = true;

// 予約語
if (context.type == "識別子")
{
var s = _convert.getKeyword(context.token);
if (s)
{
context.token = s;
context.type = "予約語";
}
}

// 終了判定用関数を 割り当て
if (context.state == "終了待ち")
context.getTerm = _convert.state.waitStart[i].getTerm;

break;
}
}
// 2 Byte文字 なら
if (!isMatch)
{
context.token = context.value.charAt(0);
context.type = (_convert.useMultiByte ? "識別子" : "不正な文字");
context.state = "開始待ち";
context.value = context.value.substring(1);
}
}
else // 終了待ち
{
// 終了?
if (context.getTerm(context.value))
{
context.token = RegExp.lastMatch;
context.state = "開始待ち";
context.value = RegExp.rightContext;
}
else // まだ、次の行に続く...
{
context.token = context.value;
context.state = "終了待ち";
context.value = "";
}
}
// トークンの種類が変わったら
if ((prevType != context.type) && (prevType != ""))
{
// トークンを出力
lineOut += tokenToHtml(prevToken, prevType);
prevToken = context.token;
}
else
{
prevToken += context.token;
}
prevType = context.type;
}
// トークンを出力
lineOut += tokenToHtml(prevToken, prevType);

return lineOut;
}
//=============================================================================
// トークンに TAG を付けて 返す
//=============================================================================
function tokenToHtml(token, type)
{
if (token.length < 1) return "";

// 変換出力用文字列
var lineOut = "";

// 1文字ずつ処理する
for (var i=0;i<token.length;i++)
{
// 1文字取り出す
var c = token.charAt(i);

// 変換対象の文字なら、変換して出力 ( "0" → "&#x30;" )
if (_escapeChar.indexOf(c) >= 0)
lineOut += "&#x" + c.charCodeAt(0).toString(16) + ";";

// それ以外なら、そのまま出力
else
lineOut += c;
}

if (fKeyword && (type == "予約語") ) return '<SPAN CLASS="KEY">' + lineOut + '</SPAN>';
if (fDirective && (type == "ディレクティブ") ) return '<SPAN CLASS="DIR">' + lineOut + '</SPAN>';
if (fComment && (type == "コメント") ) return '<SPAN CLASS="COM">' + lineOut + '</SPAN>';
if (fIdent && (type == "識別子") ) return '<SPAN CLASS="IDF">' + lineOut + '</SPAN>';
if (fString && (type == "文字列") ) return '<SPAN CLASS="STR">' + lineOut + '</SPAN>';
if (fChar && (type == "文字") ) return '<SPAN CLASS="CHA">' + lineOut + '</SPAN>';
if (fNumber && (type == "数字") ) return '<SPAN CLASS="NUM">' + lineOut + '</SPAN>';
if (fDelim && (type == "記号") ) return '<SPAN CLASS="DLM">' + lineOut + '</SPAN>';
return lineOut;
}
//*****************************************************************************
// 行番号 を 出力
//*****************************************************************************
function putLineNo(tsOut)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = _fs.OpenTextFile(_inFileName, 1);

// 行数を初期化
var lineCnt = 0;

// 行数を数える
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを1行ずつ読む
tsIn.ReadLine();
lineCnt++;
}

// 入力ファイルを 閉じる
tsIn.Close();

// もう一度、入力ファイルを 読み込み専用モードで 開く
tsIn = _fs.OpenTextFile(_inFileName, 1);

// 行番号を初期化
var lineNo = 0;

// 入力ファイルの終わりまで繰り返す
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを1行ずつ読む
tsIn.ReadLine();

// 行番号を書く
lineNo++;
if (lineNo == 1) tsOut.WriteLine('<SPAN CLASS="LNO">' + FormatNum(lineNo));
else if (lineNo == lineCnt) tsOut.WriteLine( FormatNum(lineNo) + '</SPAN>');
else tsOut.WriteLine( FormatNum(lineNo));
}

// 入力ファイルを 閉じる
tsIn.Close();
}
//-----------------------------------------------------------------------------
// 数値の書式化 (例: 123 → "00123")
//-----------------------------------------------------------------------------
function FormatNum(num)
{
var s = "00000" + num;

return (s.substr(s.length - 5, 5));
}
//*****************************************************************************
// TAB を 空白に 変換
//*****************************************************************************
function TabToSpace(lineIn)
{
// 変換出力用文字列
var lineOut = "";

// 現在位置
var pos = 0;

// 1文字ずつ処理する
for (var i=0;i<lineIn.length;i++)
{
// 1文字取り出す
var c = lineIn.substr(i, 1);

// TAB か?
if (c == "\t")
{
// 空白何文字分に置き換えればよいか
var num = 4 - (pos % 4);
// 現在位置を加算
pos += num;
// 変換して出力
lineOut += " ".substr(0, num);
}
else
{
// 現在位置を加算
if (escape(c).length < 4)
pos++;
else
pos += 2;
// そのまま出力
lineOut += c;
}
}

//行末の空白を削除
return lineOut.replace(/ +$/,"");
}