Token の読み込み用・書き込み用のクラスを分ける

Token の読み込み用・書き込み用のクラスを分ける

Token処理用のクラスを独立させる。


//*********************************************************************
// HTML に書式化して出力
//*********************************************************************
public void tohtml(Reader reader, Writer writer)
{
TokenReader tokenReader = new TokenReader(reader);
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)
{
//入力用クラス
_reader = reader;

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

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

//未確定Token を 作成
mikakuteiToken = new Token("", "その他");
}
//*********************************************************************
// 1区切りの文字列と 文字列の種類を返す
//*********************************************************************
//現在位置を保持
private int _col = 0;

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

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

書き込み用クラス


//*********************************************************************
// Tokenごとに 種類に応じた色指定タグで挟んで出力する
//*********************************************************************
public class TokenWriter
{
//出力用クラス
private Writer _writer;

public TokenWriter(Writer writer)
{
//出力用クラス
_writer = writer;
}
public void putToken(Token token)
{
if (token.tokenKind == "予約語")
{
_writer.putString("<SPAN CLASS=\"KEY\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "コメント")
{
_writer.putString("<SPAN CLASS=\"COM\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "文字列")
{
_writer.putString("<SPAN CLASS=\"STR\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "文字")
{
_writer.putString("<SPAN CLASS=\"CHA\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "数字")
{
_writer.putString("<SPAN CLASS=\"NUM\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "識別子")
{
_writer.putString("<SPAN CLASS=\"IDW\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "演算子")
{
_writer.putString("<SPAN CLASS=\"OPE\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "区切り記号")
{
_writer.putString("<SPAN CLASS=\"DLM\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else if (token.tokenKind == "ディレクティブ")
{
_writer.putString("<SPAN CLASS=\"DIR\">");
_writer.putString(token.tokenString);
_writer.putString("</SPAN>");
}
else
{
_writer.putString(token.tokenString);
}
}
}