Token の種類を判定する (数字・識別子)
今回は、数字・識別子を認識できるようにする。
「数字」は、「数字から始まり、数字か『.』からなる文字列」、と定義したいところだが、
16進表記だと、「ABCDEFXabcdefx」の英字が使用されるし、
数値リテラルとして「FDMULfdmul」の英字も使用できる。
厳密に数字を定義しようとすると、結構ややこしいので
乱暴ではあるが、「数字から始まり、英数字か『.』からなる文字列」を「数字」
と定義する。
「識別子」は、「英字か『_』から始まり、英数字か『_』からなる文字列」
と定義する。
//読み込んだ文字の種類を取得・状態を更新
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 if (Char.IsLetter(cCurr) || (cCurr == '_'))
_state = "識別子";else if (Char.IsDigit(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 == '\"') && (cPrev != '\\'))
_state = "その他";
}else if (_state == "文字")
{
currToken.tokenKind = "文字";if ((cCurr == '\'') && (cPrev != '\\'))
_state = "その他";
}else if (_state == "識別子")
{
currToken.tokenKind = "識別子";if (!Char.IsLetter(cCurr) && !Char.IsDigit(cCurr) && (cCurr != '_'))
_state = "その他";
}else if (_state == "数字")
{
currToken.tokenKind = "数字";if (!Char.IsLetter(cCurr) && !Char.IsDigit(cCurr) && (cCurr != '.'))
_state = "その他";
}return currToken;
}