他言語に対応する (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("", "その他");
}
}