他言語に対応する

他言語に対応する

VC++」「C++Builder」「Java」「JavaScript」など、
「中括弧族」と呼ばれる言語は、予約語の定義ファイルを変えるだけで対応できるが、
VisualBasicDelphiT-SQLPL/SQL などは、構文上、文字と文字列の区別をしない、
英字の大文字・小文字を意識しない、など、現在の「TokenReader」クラスでは、
対応できない。

そこで、全ての言語に共通な処理だけを「TokenReader」に残し、
英字の大文字・小文字を意識する「TokenReaderCase」と、
英字の大文字・小文字を意識しない「TokenReaderNoCase」とを
「TokenReader」を継承して作成する。

VisualBasic」用には、「TokenReaderNoCase」をさらに継承した「TokenReaderVB」
を作成し、
Delphi」用にも、「TokenReaderNoCase」を継承した「TokenReaderDelphi」
を作成する。
T-SQL」、「PL/SQL」も同様である。


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

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

tokenReader = null;
tokenWriter = null;
}

読み込み用クラス (ベースクラス)


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

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

//未確定 Token
protected Token mikakuteiToken = null;
//確定済み Token
protected Token kakuteiToken = null;
//1つ前の確定済み Token
protected Token prevToken = null;
//***************************************************************************
// 初期化
//***************************************************************************
public static TokenReader Create(Reader reader, string langType)
{
if (langType == "cs7") return new TokenReaderCase(reader, langType); // VC#.NET
else if (langType == "vc6") return new TokenReaderCase(reader, langType); // VC++
else if (langType == "vc7") return new TokenReaderCase(reader, langType); // VC++.NET
else if (langType == "vj6") return new TokenReaderCase(reader, langType); // VJ++
else if (langType == "vj7") return new TokenReaderCase(reader, langType); // VJ#.NET
else if (langType == "java") return new TokenReaderCase(reader, langType); // Java
else if (langType == "js") return new TokenReaderCase(reader, langType); // JavaScript
else if (langType == "bcb") return new TokenReaderCase(reader, langType); // C++Builder
else if (langType == "vb6") return new TokenReaderVB(reader, langType); // VB
else if (langType == "vb7") return new TokenReaderVB(reader, langType); // VB.NET
else if (langType == "del") return new TokenReaderDelphi(reader, langType); // Delphi
else if (langType == "psq") return new TokenReaderPlsql(reader, langType); // PL/SQL
else if (langType == "tsq") return new TokenReaderTsql(reader, langType); // T-SQL
else return new TokenReaderCase(reader, langType); // other
}
protected 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("", "その他");
}
//***************************************************************************
// 終了
//***************************************************************************
~TokenReader()
{
_keyWords = null;
mikakuteiToken = null;
kakuteiToken = null;
prevToken = null;
}
//*********************************************************************
// 1区切りの文字列と 文字列の種類を返す
//*********************************************************************
//現在位置を保持
protected int _col = 0;

protected const char EOF = '\0';
protected const char NEWLINE = '\n';
protected const char TAB = '\t';
protected const char BLANK = ' ';

public Token getToken()
{
省略
}
//***************************************************************************
// 読み込み文字列に追加
//***************************************************************************
protected string _state = "その他";
protected void addToken(string s)
{
省略
}
protected void addToken(char c);
{
省略
}
protected void addToken(char cPrev, char cCurr, char cNext);
{
省略
}
//***************************************************************************
// 読み込んだ文字の種類を取得・状態を更新
//***************************************************************************
abstract protected Token getCurrToken(char cPrev, char cCurr, char cNext)
//***************************************************************************
// 文字種が変わったら、変わる前の文字列情報を返す
//***************************************************************************
protected Token getPrevToken()
{
省略
}
//***************************************************************************
// 現在位置が、TAB 位置かどうかを返す
//***************************************************************************
protected bool TabPos(int col)
{
省略
}
//***************************************************************************
// 取得した文字のByte数を返す
//***************************************************************************
protected int getLength(char c)
{
省略
}
}

読み込み用クラス (大文字・小文字を意識する 言語用)


//****************************************************************************
// Tokenごとに 文字列と その種類を返す ( 大文字・小文字を意識する 言語用 )
//****************************************************************************
public class TokenReaderCase : TokenReader
{
internal TokenReaderCase(Reader reader, string langType) : base(reader, langType)
{
}
//***************************************************************************
// 読み込んだ文字の種類を取得・状態を更新
//***************************************************************************
protected override Token getCurrToken(char cPrev, char cCurr, char cNext)
{
省略
}
}

読み込み用クラス (大文字・小文字を意識しない 言語用)


//********************************************************************************
// Tokenごとに 文字列と その種類を返す ( 大文字・小文字を意識しない 言語用 )
//********************************************************************************
abstract public class TokenReaderNoCase : TokenReader
{
//予約語 コレクション (全て小文字にしたもの)
protected System.Collections.Specialized.StringCollection _keyWordsNoCase;

protected TokenReaderNoCase(Reader reader, string langType) : base(reader, langType)
{
//予約語 コレクションを設定 (".\cs7\key.txt")
_keyWordsNoCase = 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)
{
_keyWordsNoCase.Add(s.ToLower());
}
keyReader.Close();
keyReader = null;
}
//***************************************************************************
// 終了
//***************************************************************************
~TokenReaderNoCase()
{
_keyWordsNoCase = null;
}
//***************************************************************************
// 読み込んだ文字の種類を取得・状態を更新
//***************************************************************************
abstract protected override Token getCurrToken(char cPrev, char cCurr, char cNext)
}