OSDN Git Service

余計なGTAGSをコミットしないようにした。
[simplecms/utakata.git] / lexer.cpp
1 #include <iostream>
2
3 #include "lexer.h"
4
5 using namespace utakata;
6
7 smart_ptr<lexer::CLexeme> lexer::CLexer::lex(smart_ptr<utf8::CUTF8InputStream>& stream)
8 {
9     // 渡されたCUTF8InputStreamから、1文字ずつ読んでいき、各構文を解釈
10     // する。
11
12     // 何か一つの非終端記号、終端記号を読みだすたびにそれを返す。
13
14     // まずは何はなくとも1文字読みだす。
15
16     // EOF以外の値の場合には、通常の字句解析を行っていく。
17     utf8_string::CUTF8String str();
18     bool first = true;
19     while (!stream->isEOF()) {
20
21         // 意味のある文字のみで構成していく。
22
23         utf8_string::CUTF8Char ch(stream->read());
24
25         // 最初の一文字で、大体決定されるため、firstをチェックして
26         // いく。
27         if (first)
28         {
29             first = false;
30
31             // ()[]`',.は構文解析の重要な要素となるため、このまま返す。
32             if (ch.toUTF16Code() == '(' || ch.toUTF16Code() == '[')
33             {
34                 return makeStartParen();
35             }
36
37             if (ch.toUTF16Code() == ')' || ch.toUTF16Code() == ']')
38             {
39                 return makeEndParen();
40             }
41
42             if (ch.toUTF16Code() == '`')
43             {
44                 return makeBackQuote();
45             }
46
47             if (ch.toUTF16Code() == '\'')
48             {
49                 return makeQuote();
50             }
51
52             if (ch.toUTF16Code() == '.')
53             {
54                 return makeDot();
55             }
56
57             if (ch.toUTF16Code() == ',')
58             {
59                 return makeComma();
60             }
61
62             if (ch.toUTF16Code() == '"')
63             {
64                 // 先頭が"の場合、stringと判断される。
65                 return makeString(stream);
66             }
67
68         }
69         else
70         {
71             // それまでに読みだした文字列が固定の文字列かどうか。
72             
73             // 読出した文字がデリミタであるかどうか。
74             if (isDelimiter(ch))
75             {
76                 // デリミタ文字である場合、このデリミタ文字に来るまでの間に
77                 // 保存した文字列から、実際のデータを作成する。
78                 // ここに来るまでにすでに型は決定されているはずなので、
79                 // その型を基にして作成する。
80                 
81             }
82
83             
84         }
85     }
86 }