5 using namespace utakata;
7 smart_ptr<lexer::CLexeme> lexer::CLexer::lex(smart_ptr<utf8::CUTF8InputStream>& stream)
9 // 渡されたCUTF8InputStreamから、1文字ずつ読んでいき、各構文を解釈
12 // 何か一つの非終端記号、終端記号を読みだすたびにそれを返す。
16 // EOF以外の値の場合には、通常の字句解析を行っていく。
17 utf8_string::CUTF8String str();
19 while (!stream->isEOF()) {
23 utf8_string::CUTF8Char ch(stream->read());
25 // 最初の一文字で、大体決定されるため、firstをチェックして
31 // ()[]`',.は構文解析の重要な要素となるため、このまま返す。
32 if (ch.toUTF16Code() == '(' || ch.toUTF16Code() == '[')
34 return makeStartParen();
37 if (ch.toUTF16Code() == ')' || ch.toUTF16Code() == ']')
39 return makeEndParen();
42 if (ch.toUTF16Code() == '`')
44 return makeBackQuote();
47 if (ch.toUTF16Code() == '\'')
52 if (ch.toUTF16Code() == '.')
57 if (ch.toUTF16Code() == ',')
62 if (ch.toUTF16Code() == '"')
64 // 先頭が"の場合、stringと判断される。
65 return makeString(stream);
71 // それまでに読みだした文字列が固定の文字列かどうか。
73 // 読出した文字がデリミタであるかどうか。
76 // デリミタ文字である場合、このデリミタ文字に来るまでの間に
77 // 保存した文字列から、実際のデータを作成する。
78 // ここに来るまでにすでに型は決定されているはずなので、