1 #include "src/lexer/term_checker.h"
2 #include "src/unicode.h"
3 #include "src/encoding_reader.h"
5 namespace term = utakata::lexer::term;
6 namespace unicode = utakata::unicode;
7 namespace reader = utakata::reader;
10 bool term::Delimiter::operator()(reader::EncodingReader* reader,
12 unicode::UniChar ch(reader->Peek());
13 switch (ch.rawcode()) {
24 return term::Whitespace()(reader, size);
30 bool term::Whitespace::operator()(reader::EncodingReader* reader,
32 unicode::UniChar ch(reader->Peek());
33 switch (ch.rawcode()) {
34 case '\r': // carriage return
35 case '\n': // linefeed
38 case '\v': // vertical tab
47 // targetが\rである場合、次の一文字のチェックも必要となりますが、
48 // \r単体である場合でも、改行として見做されます。
49 bool term::LineEnding::operator()(reader::EncodingReader* reader,
51 unicode::UniChar ch(reader->Peek());
52 switch (ch.rawcode()) {
57 unicode::UniString ch2(reader->Peek(2));
58 if (ch2.At(0).rawcode() == '\r' && ch2.At(1).rawcode() == '\n') {
71 bool term::HexValue::operator()(reader::EncodingReader* reader,
73 unicode::UniChar ch(reader->Peek());
74 if (('a' <= ch.rawcode() && ch.rawcode() <= 'f') ||
75 ('A' <= ch.rawcode() && ch.rawcode() <= 'F') ||
76 ('0' <= ch.rawcode() && ch.rawcode() <= '9')) {
84 bool term::StringDoubleQuote::operator()(reader::EncodingReader* reader,
86 unicode::UniChar ch(reader->Peek());
87 if (ch.rawcode() == '"') {
94 // prefixは2文字未満である場合は正常なプレフィックスでは無いとして処理を行いません。
95 bool term::NumberPrefixChecker::operator()(const unicode::UniString& str) {
96 if (str.GetSize() < 2) {
100 const unicode::UniChar& first_sharp = str.At(0);
101 const unicode::UniChar& radix_type = str.At(0);
102 if (first_sharp.rawcode() == '#') {
103 if (radix_type.rawcode() == 'b' || radix_type.rawcode() == 'B' ||
104 radix_type.rawcode() == 'o' || radix_type.rawcode() == 'O' ||
105 radix_type.rawcode() == 'x' || radix_type.rawcode() == 'X' ||
106 radix_type.rawcode() == 'd' || radix_type.rawcode() == 'D') {
113 // exactnessは2文字であるため、渡された文字列のサイズが2未満である場合には
115 bool term::NumberExactnessChecker::operator()(
116 const unicode::UniString& str) {
117 if (str.GetSize() < 2) {
121 unicode::UniChar first_sharp = str.At(0);
122 unicode::UniChar exact_type = str.At(1);
124 if (first_sharp.rawcode() == '#') {
125 if (exact_type.rawcode() == 'i' || exact_type.rawcode() == 'I' ||
126 exact_type.rawcode() == 'e' || exact_type.rawcode() == 'E') {