Token の種類を判定する (文字・文字列)
Token の種類を判定する (文字・文字列)
前回は、少し本格的に、
「/*」から 「*/」までと、「//」から「\n」までを「コメント」と判定できるようにしたが、
文字列中の、「/*」、 「*/」、 「//」 もコメントの開始・終了と認識してしまう。
そこで今回は、文字・文字列を認識する処理を追加して、
文字列中の、「/*」、 「*/」、 「//」 は、単なる文字列として扱い、
コメントの開始・終了と誤認識しないようにする。
//読み込んだ文字の種類を取得・状態を更新
private Token getCurrToken(char cPrev, char cCurr, char cNext)
{
Token currToken = new Token(cCurr.ToString(), "その他");if (_state == "その他")
{
if (cCurr == '/')
{
if (cNext == '/')
_state = "単一行コメント";
else if (cNext == '*')
_state = "複数行コメント";
else
_state = "その他";
}
else if (cCurr == '\"')
_state = "文字列";else if (cCurr == '\'')
_state = "文字";else
_state = "その他";if ((_state == "単一行コメント") || (_state == "複数行コメント"))
currToken.tokenKind = "コメント";else
currToken.tokenKind = _state;
}else if (_state == "単一行コメント")
{
currToken.tokenKind = "コメント";if (cCurr == '\n')
{
currToken.tokenKind = "その他";
_state = "その他";
}
}else if (_state == "複数行コメント")
{
currToken.tokenKind = "コメント";if ((cCurr == '/') && (cPrev == '*'))
_state = "その他";
}else if (_state == "文字列")
{
currToken.tokenKind = "文字列";if (cCurr == '\"')
_state = "その他";else if (cCurr == '\\')
_state = "文字列中のエスケープシーケンス";
}else if (_state == "文字列中のエスケープシーケンス")
{
currToken.tokenKind = "文字列";
_state = "文字列";
}else if (_state == "文字")
{
currToken.tokenKind = "文字";if ((cCurr == '\'') && (cPrev != '\\'))
_state = "その他";
}return currToken;
}