/// <summary> /// 現在の位置から記号以外のトークンを 1 つ取得します。 /// </summary> /// <returns>取得した記号以外のトークン。未定義の文字列が検出された場合は不明なトークン。</returns> /// <remarks> /// このメソッドは取得したトークンの文字数だけ位置を進めます。 /// </remarks> private NakoToken GetNotFlagToken() { char c = CurrentChar; // 数字の場合 if (NakoUtility.IsNumber(c)) { return(GetNumberToken()); } // 単語の場合 if (c > 0xFF || NakoUtility.IsAlpha(c) || c == '_') { return(GetWordToken()); } return(new NakoToken(NakoTokenType.UNKNOWN, lineNo, indentLevel)); }
/// <summary> /// 現在の位置から単語のトークンを 1 つ取得します。 /// </summary> /// <returns>取得した単語のトークン。</returns> /// <remarks> /// このメソッドは取得したトークンの文字数だけ位置を進めます。 /// </remarks> private NakoToken GetWordToken() { var token = new NakoToken(NakoTokenType.WORD, lineNo, indentLevel); var builder = new StringBuilder(); while (!IsEOF) { char c = CurrentChar; if (NakoUtility.IsAlpha(c) || NakoUtility.IsNumber(c) || c == '_' || c == '!' || c == '?') { builder.Append(c); position++; continue; } // 助詞なら区切る if (NakoUtility.IsHiragana(c)) { if (CheckJosi(token)) { break; } } // 全角文字なら読む if (c >= 0xFF) { builder.Append(c); position++; // 特別な予約語なら区切る if (builder.ToString() == "もし" || builder.ToString() == "ならば") { break; } continue; } break; } token.Value = builder.ToString(); return(token); }