OSDN Git Service

5b7206f0a016e3d585f16d9a7d7ef77cc5db9f86
[simplecms/utakata.git] / src / delimiter.cpp
1 #include "delimiter.h"
2 #include "reader.h"
3 #include "unicode.h"
4
5 using namespace utakata::lexer_delimiter;
6
7 bool Normal::operator()(const utakata::unicode::UniChar& ch)
8 {
9     // 渡された文字がデリミタかどうかを返す。
10         // 渡された文字がデリミタかどうかを判別する。
11     // このクラスガ判別するデリミタは、
12     // <delimiter> - ( | ) | [ | ] | " | ; | #
13     //          | <whitespace>
14     // <whitespace> - <character tabulation>
15     //          | <linefeed> | <line tabulation> | <form feed>
16     //          | <carriage return> | <next line>
17     //          | <any character whose category is Zs, Zl, or Zp>
18     // に該当するデリミタ。
19     // このデリミタは、<boolean>,<string>,<number>, .<character>
20     // を解析している間に出現するものであり、それ以外の場合は、
21     // デリミタとして読み飛ばしてはならない。
22
23     switch (ch.getRawCode())
24     {
25     case '(':
26     case '[':
27     case ')':
28     case ']':
29     case '"':
30     case ';':
31     case '#':
32         return true;
33     default:
34         // それ以外の場合、whitespaceである可能正があるため、そちらはそちら
35         // で読みとばす。
36         return Whitespace()(ch);
37     }
38 }
39
40 bool Whitespace::operator()(const utakata::unicode::UniChar& ch)
41 {
42     switch (ch.getRawCode())
43     {
44     case '\r':                  // carriage return 復帰
45     case '\n':                  // linefeed  改行
46     case ' ':                   // space 空白
47     case '\t':                  // tab タブ
48     case '\v':                  // vertical tab 垂直タブ
49     case '\f':                  // page 改ページ
50         return true;
51     default:
52         return false;
53     }
54 }
55
56 bool LineEnding::operator()(const utakata::unicode::UniChar& ch,
57                             smart_ptr<utakata::reader::StreamReader>& strm)
58 {
59     // 今の文字と、次の文字とを利用してチェックする。
60     switch (ch.getRawCode())
61     {
62     case '\n': return true;
63     case '\r':
64         //次の文字が必要になる。
65     {
66         utakata::unicode::UniChar ch2(strm->peek());
67         if (ch2.getRawCode() == '\n')
68         {
69             strm->read();
70         }
71         return true;
72     }
73     default:
74         return false;
75     }
76 }
77
78 bool HexValue::operator()(const utakata::unicode::UniChar& ch)
79 {
80     if (ch.getRawCode() >= 'a' && ch.getRawCode() <= 'f')
81     {
82         return true;
83     }
84     else if (ch.getRawCode() >= 'A' && ch.getRawCode() <= 'F')
85     {
86         return true;
87     }
88
89     // 最後に数値だけの判定を返す。
90     return utakata::unicode::is_numeric(ch);
91 }
92
93 bool String::operator()(const utakata::unicode::UniChar& ch)
94 {
95     if (ch.getRawCode() == '"')
96     {
97         return true;
98     }
99     return false;
100 }
101
102 bool Prefix::operator()(const utakata::unicode::UniString& str)
103 {
104     if (str.size() <= 2)
105     {
106         return false;
107     }
108     
109     utakata::unicode::UniChar s = str[0];
110     utakata::unicode::UniChar s1 = str[1];
111     if (s.getRawCode() == '#' && (s1 == 'b' || s1 == 'B' ||
112                                   s1 == 'o' || s1 == 'O' ||
113                                   s1 == 'x' || s1 == 'X' || 
114                                   s1 == 'd' || s1 == 'D')
115         )
116     {
117         return true;
118     }
119     return false;
120 }
121
122 bool Exactness::operator()(const utakata::unicode::UniString& str)
123 {
124     if (str.size() <= 2)
125     {
126         return false;
127     }
128     
129     utakata::unicode::UniChar s = str[0];
130     utakata::unicode::UniChar s1 = str[1];
131
132     if (s.getRawCode() == '#' && (s1 == 'i' || s1 == 'I' ||
133                                   s1 == 'e' || s1 == 'E')
134         )
135     {
136         return true;
137     }
138     return false;
139 }