5 using namespace utakata::lexer_delimiter;
7 bool Normal::operator()(const utakata::unicode::UniChar& ch)
10 // 渡された文字がデリミタかどうかを判別する。
12 // <delimiter> - ( | ) | [ | ] | " | ; | #
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>
19 // このデリミタは、<boolean>,<string>,<number>, .<character>
20 // を解析している間に出現するものであり、それ以外の場合は、
21 // デリミタとして読み飛ばしてはならない。
23 switch (ch.getRawCode())
34 // それ以外の場合、whitespaceである可能正があるため、そちらはそちら
36 return Whitespace()(ch);
40 bool Whitespace::operator()(const utakata::unicode::UniChar& ch)
42 switch (ch.getRawCode())
44 case '\r': // carriage return 復帰
45 case '\n': // linefeed 改行
48 case '\v': // vertical tab 垂直タブ
49 case '\f': // page 改ページ
56 bool LineEnding::operator()(const utakata::unicode::UniChar& ch,
57 smart_ptr<utakata::reader::StreamReader>& strm)
59 // 今の文字と、次の文字とを利用してチェックする。
60 switch (ch.getRawCode())
62 case '\n': return true;
66 utakata::unicode::UniChar ch2(strm->peek());
67 if (ch2.getRawCode() == '\n')
78 bool HexValue::operator()(const utakata::unicode::UniChar& ch)
80 if (ch.getRawCode() >= 'a' && ch.getRawCode() <= 'f')
84 else if (ch.getRawCode() >= 'A' && ch.getRawCode() <= 'F')
90 return utakata::unicode::is_numeric(ch);
93 bool String::operator()(const utakata::unicode::UniChar& ch)
95 if (ch.getRawCode() == '"')
102 bool Prefix::operator()(const utakata::unicode::UniString& str)
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')
122 bool Exactness::operator()(const utakata::unicode::UniString& str)
129 utakata::unicode::UniChar s = str[0];
130 utakata::unicode::UniChar s1 = str[1];
132 if (s.getRawCode() == '#' && (s1 == 'i' || s1 == 'I' ||
133 s1 == 'e' || s1 == 'E')