OSDN Git Service

- lexemeとリテラルオブジェクト間のオブジェクト変換を行うためのLiteralDataを追加。
[simplecms/utakata.git] / lexeme_impl.h
1 #ifndef _LEXEME_IMPL_H_
2 #define _LEXEME_IMPL_H_
3
4 #include "lexeme.h"
5 #include "smart_ptr.h"
6 #include "utf8_string.h"
7
8 // lexeme の様々な実装を定義する.
9 namespace utakata {
10
11     namespace lexeme {
12         class LexemeID;
13
14         // 各 lexeme を smart_ptr にして取得する.
15         smart_ptr<ILexeme> makeOpenParen ();
16         smart_ptr<ILexeme> makeEOS ();
17         smart_ptr<ILexeme> makeCloseParen ();
18         smart_ptr<ILexeme> makeBackQuote ();
19         smart_ptr<ILexeme> makeQuote ();
20         smart_ptr<ILexeme> makeDot ();
21         smart_ptr<ILexeme> makeUnquoteSplicing (const utakata::utf8_string::UTF8String& str);
22         smart_ptr<ILexeme> makeUnquote ();
23         smart_ptr<ILexeme> makeSyntax ();
24         smart_ptr<ILexeme> makeQuasiSyntax ();
25         smart_ptr<ILexeme> makeUnsyntaxSplicing ();
26         smart_ptr<ILexeme> makeUnsyntax ();
27         smart_ptr<ILexeme> makeByteVector ();
28         smart_ptr<ILexeme> makeVector ();
29         smart_ptr<ILexeme> makeIdentifier (const utakata::utf8_string::UTF8String& str);
30         smart_ptr<ILexeme> makeString (const utakata::utf8_string::UTF8String& str);
31         smart_ptr<ILexeme> makeNumber (const utakata::utf8_string::UTF8String& real,
32                                       const utakata::utf8_string::UTF8String& imaginary,
33                                       bool exact, int radix);
34         smart_ptr<ILexeme> makeCharactor (const utakata::utf8_string::UTF8String& str);
35         smart_ptr<ILexeme> makeNanImaginary (const utakata::utf8_string::UTF8String& str,
36                                             bool exact);
37         smart_ptr<ILexeme> makeInfImaginary (const utakata::utf8_string::UTF8String& str,
38                                             bool exact);
39         smart_ptr<ILexeme> makeImaginaryOnly (const utakata::utf8_string::UTF8String& str,
40                                              bool exact);
41         smart_ptr<ILexeme> makeBoolean (const smart_ptr<utakata::utf8_string::UTF8Char>& ch);
42
43
44         ////////////////////////////////////////////
45         // 実際に利用する lexeme は以下に実装する. //
46         ////////////////////////////////////////////
47
48         class PureLexeme : public ILexeme
49         {
50             // LiteralDataを必要としないデータに対して処理を行うためのクラス。
51             // 文字列と該当するLexemeIDを渡すことで実現する。
52         public:
53             PureLexeme(const smart_ptr<utakata::utf8_string::UTF8String>& str,
54                        const lexeme::LexemeID id);
55             virtual ~PureLexeme() {}
56
57             const lexeme::LexemeID getID() const ;
58             smart_ptr<utakata::utf8_string::UTF8String> toString() const;
59             smart_ptr<utakata::interpreter::LiteralData> getData() const;
60
61         private:
62
63             smart_ptr<utakata::utf8_string::UTF8String> str_;
64             const lexeme::LexemeID& id_;
65         };
66
67         ////////////
68         // String //
69         ////////////
70
71         class String : public ILexeme
72         {
73         public:
74             
75             String (const utakata::utf8_string::UTF8String& ident);
76             virtual ~String (){}
77             const lexeme::LexemeID getID () const;
78             smart_ptr<utakata::utf8_string::UTF8String> toString () const;
79             smart_ptr<utakata::interpreter::LiteralData> getData() const;
80
81         private:
82
83             smart_ptr<utakata::utf8_string::UTF8String> str_;
84
85         };
86
87         ////////////////
88         // Identifier //
89         ////////////////
90
91         class Identifier : public ILexeme
92         {
93         public:
94             
95             Identifier (const utakata::utf8_string::UTF8String& ident);
96             virtual ~Identifier (){}
97             const lexeme::LexemeID getID () const;
98             smart_ptr<utakata::utf8_string::UTF8String> toString () const;
99             smart_ptr<utakata::interpreter::LiteralData> getData() const;
100             
101         private:
102
103             smart_ptr<utakata::utf8_string::UTF8String> str_;
104
105         };
106
107         ////////////
108         // Number //
109         ////////////
110
111         class Number : public ILexeme
112         {
113         public:
114             Number (const utf8_string::UTF8String& real, const utf8_string::UTF8String& imagin,
115                    bool exact, int radix);
116             virtual ~Number (){}
117             const lexeme::LexemeID getID () const;
118             smart_ptr<utakata::utf8_string::UTF8String> toString () const;
119             smart_ptr<utakata::interpreter::LiteralData> getData() const;
120         private:
121
122             smart_ptr<utakata::interpreter::LiteralData> data_;
123         };
124
125         ///////////////
126         // Charactor //
127         ///////////////
128
129         class Charactor : public ILexeme
130         {
131         public:
132             Charactor (const utf8_string::UTF8String& ch);
133             virtual ~Charactor (){}
134
135             const lexeme::LexemeID getID () const;
136             smart_ptr<utakata::utf8_string::UTF8String> toString() const;
137             smart_ptr<utakata::interpreter::LiteralData> getData() const;
138
139         private:
140
141             smart_ptr<utakata::utf8_string::UTF8String> ch_;
142         };
143
144         /////////////
145         // Boolean //
146         /////////////
147
148         class Boolean : public ILexeme
149         {
150         public:
151             Boolean (const smart_ptr<utf8_string::UTF8Char>& ch);
152             virtual ~Boolean (){}
153
154             const lexeme::LexemeID getID () const;
155             smart_ptr<utakata::utf8_string::UTF8String> toString () const;
156             smart_ptr<utakata::interpreter::LiteralData> getData() const;
157
158         private:
159             smart_ptr<utf8_string::UTF8String> bool_;
160         };
161
162     };
163
164 };
165
166 #endif /* _LEXEME_IMPL_H_ */