他言語に対応する (VC++, C++Builder, Java, JavaScript)

他言語に対応する (VC++, C++Builder, Java, JavaScript)

これまで、「VC#」のソースを HTML化することを考えてきたが、
VC++」「C++Builder」「Java」「JavaScript」など、
「中括弧族」と呼ばれる言語は全て、予約語の定義ファイルを
変えるだけで対応できそうである。

そこで言語タイプを、実行時引数として、以下のように指定する。

VC#.NET "cs7"
VC++6 "vc6"
VC++.NET "vc7"
VJ++6 "vj6"
VJ#.NET "vj7"
Java "java"
JavaScript "js"
C++Builder "bcb"

前もって、それぞれの言語に対応した 予約語ファイル "key.txt" と
演算子ファイル "ope.txt" を、言語タイプごとのフォルダに
配置しておく。
つまり、VC#.NET用の予約語ファイルは、"\cs7\key.txt"、
演算子ファイルは、"\cs7\ope.txt"、
VC++6用の予約語ファイルは、"\vc6\key.txt"、
演算子ファイルは、"\vc6\ope.txt"。

「Token」を切り出すクラス「TokenRaeder」に言語タイプを
渡して初期化すると、「TokenRaeder」は、
"\言語タイプ\key.txt"、"\言語タイプ\ope.txt"を読んで、
予約語コレクション、演算子コレクションを生成する。


//ソースファイルを読んで、ソース部を出力する
Reader source = new Reader("Form1.cs");
tohtml(source, writer, args[0]);
source.Close();
source = null;


//*********************************************************************
// HTML に書式化して出力
//*********************************************************************
public void tohtml(Reader reader, Writer writer, string langType)
{
TokenReader tokenReader = new TokenReader(reader, langType);
TokenWriter tokenWriter = new TokenWriter(writer);

//ファイルの終わりまで、1区切りずつ読んで
Token token;
while((token = tokenReader.getToken()) != null)
{
//文字列の種類に応じた色指定タグで挟んで出力する
tokenWriter.putToken(token);
}

tokenReader = null;
tokenWriter = null;
}

読み込み用クラス


//*********************************************************************
// Tokenごとに 文字列と その種類を返す
//*********************************************************************
public class TokenReader
{
//入力用クラス
private Reader _reader;

//予約語 コレクション
private System.Collections.Specialized.StringCollection _keyWords;
//演算子 コレクション
private string _operators;

//未確定 Token
private Token mikakuteiToken = null;
//確定済み Token
private Token kakuteiToken = null;
//1つ前の確定済み Token
private Token prevToken = null;
//***************************************************************************
// 初期化
//***************************************************************************
public TokenReader(Reader reader, string langType)
{
//入力用クラス
_reader = reader;

//予約語 コレクションを設定 (".\cs7\key.txt")
_keyWords = new System.Collections.Specialized.StringCollection();
System.IO.StreamReader keyReader = new System.IO.StreamReader(System.Windows.Forms.Application.StartupPath + "\\" + langType + "\\key.txt", System.Text.Encoding.GetEncoding("Shift_JIS"));
string s;
while ((s = keyReader.ReadLine()) != null)
{
_keyWords.Add(s);
}
keyReader.Close();
keyReader = null;

//演算子 コレクションを設定 (".\cs7\ope.txt")
_operators = "";
System.IO.StreamReader opeReader = new System.IO.StreamReader(System.Windows.Forms.Application.StartupPath + "\\" + langType + "\\ope.txt", System.Text.Encoding.GetEncoding("Shift_JIS"));
while ((s = opeReader.ReadLine()) != null)
{
_operators += s;
}
opeReader.Close();
opeReader = null;

//未確定Token を 作成
mikakuteiToken = new Token("", "その他");
}
}