Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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);
        }