+++ /dev/null
-#include "delimiter.h"
-#include "reader.h"
-#include "unicode.h"
-
-using namespace utakata::lexer_delimiter;
-
-bool Normal::operator()(const utakata::unicode::UniChar& ch)
-{
- // 渡された文字がデリミタかどうかを返す。
- // 渡された文字がデリミタかどうかを判別する。
- // このクラスガ判別するデリミタは、
- // <delimiter> - ( | ) | [ | ] | " | ; | #
- // | <whitespace>
- // <whitespace> - <character tabulation>
- // | <linefeed> | <line tabulation> | <form feed>
- // | <carriage return> | <next line>
- // | <any character whose category is Zs, Zl, or Zp>
- // に該当するデリミタ。
- // このデリミタは、<boolean>,<string>,<number>, .<character>
- // を解析している間に出現するものであり、それ以外の場合は、
- // デリミタとして読み飛ばしてはならない。
-
- switch (ch.getRawCode())
- {
- case '(':
- case '[':
- case ')':
- case ']':
- case '"':
- case ';':
- case '#':
- return true;
- default:
- // それ以外の場合、whitespaceである可能正があるため、そちらはそちら
- // で読みとばす。
- return Whitespace()(ch);
- }
-}
-
-bool Whitespace::operator()(const utakata::unicode::UniChar& ch)
-{
- switch (ch.getRawCode())
- {
- case '\r': // carriage return 復帰
- case '\n': // linefeed 改行
- case ' ': // space 空白
- case '\t': // tab タブ
- case '\v': // vertical tab 垂直タブ
- case '\f': // page 改ページ
- return true;
- default:
- return false;
- }
-}
-
-bool LineEnding::operator()(const utakata::unicode::UniChar& ch,
- smart_ptr<utakata::reader::StreamReader>& strm)
-{
- // 今の文字と、次の文字とを利用してチェックする。
- switch (ch.getRawCode())
- {
- case '\n': return true;
- case '\r':
- //次の文字が必要になる。
- {
- utakata::unicode::UniChar ch2(strm->peek());
- if (ch2.getRawCode() == '\n')
- {
- strm->read();
- }
- return true;
- }
- default:
- return false;
- }
-}
-
-bool HexValue::operator()(const utakata::unicode::UniChar& ch)
-{
- if (ch.getRawCode() >= 'a' && ch.getRawCode() <= 'f')
- {
- return true;
- }
- else if (ch.getRawCode() >= 'A' && ch.getRawCode() <= 'F')
- {
- return true;
- }
-
- // 最後に数値だけの判定を返す。
- return utakata::unicode::is_numeric(ch);
-}
-
-bool String::operator()(const utakata::unicode::UniChar& ch)
-{
- if (ch.getRawCode() == '"')
- {
- return true;
- }
- return false;
-}
-
-bool Prefix::operator()(const utakata::unicode::UniString& str)
-{
- if (str.size() <= 2)
- {
- return false;
- }
-
- utakata::unicode::UniChar s = str[0];
- utakata::unicode::UniChar s1 = str[1];
- if (s.getRawCode() == '#' && (s1 == 'b' || s1 == 'B' ||
- s1 == 'o' || s1 == 'O' ||
- s1 == 'x' || s1 == 'X' ||
- s1 == 'd' || s1 == 'D')
- )
- {
- return true;
- }
- return false;
-}
-
-bool Exactness::operator()(const utakata::unicode::UniString& str)
-{
- if (str.size() <= 2)
- {
- return false;
- }
-
- utakata::unicode::UniChar s = str[0];
- utakata::unicode::UniChar s1 = str[1];
-
- if (s.getRawCode() == '#' && (s1 == 'i' || s1 == 'I' ||
- s1 == 'e' || s1 == 'E')
- )
- {
- return true;
- }
- return false;
-}