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::IReader* reader,
12 unicode::UniChar ch(reader->Peek());
13 switch (ch.rawcode()) {
24 return term::Whitespace()(reader, size);
30 bool term::Whitespace::operator()(reader::IReader* 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::IReader* reader,
51 unicode::UniChar ch(reader->Peek());
52 switch (ch.rawcode()) {
57 unicode::UniString ch2(unicode::Convert(reader->Peek(2)));
58 if (ch2.At(0).rawcode() == '\r' && ch2.At(1).rawcode() == '\n') {
71 bool term::StringDoubleQuote::operator()(reader::IReader* reader,
73 unicode::UniChar ch(reader->Peek());
74 if (ch.rawcode() == '"') {
82 bool term::HexValue::operator()(reader::IReader* reader,
84 unicode::UniChar ch(reader->Peek());
85 if (('a' <= ch.rawcode() && ch.rawcode() <= 'f') ||
86 ('A' <= ch.rawcode() && ch.rawcode() <= 'F') ||
87 ('0' <= ch.rawcode() && ch.rawcode() <= '9')) {
95 bool term::HexValueChecker::operator()(const unicode::UniChar& ch) {
96 return (('a' <= ch.rawcode() && ch.rawcode() <= 'f') ||
97 ('A' <= ch.rawcode() && ch.rawcode() <= 'F') ||
98 ('0' <= ch.rawcode() && ch.rawcode() <= '9'));
102 bool term::IntralineWhitespace::operator()(reader::IReader* reader,
103 unsigned int* size) {
104 unicode::UniChar ch(reader->Peek());
105 if (ch.rawcode() == ' ' || ch.rawcode() == '\t') {
113 bool term::Letter::operator()(reader::IReader* reader,
114 unsigned int* size) {
115 unicode::UniChar ch(reader->Peek());
116 if (unicode::IsAlphabet(ch)) {
124 bool term::SpecialInitial::operator()(reader::IReader* reader,
125 unsigned int* size) {
126 unicode::UniChar ch(reader->Peek());
127 switch (ch.rawcode()) {
150 bool term::SpecialSubsequent::operator()(reader::IReader* reader,
151 unsigned int* size) {
152 unicode::UniChar ch(reader->Peek());
153 switch (ch.rawcode()) {
166 bool term::Digit::operator()(reader::IReader* reader,
167 unsigned int* size) {
168 unicode::UniChar ch(reader->Peek());
169 if (unicode::IsNumeric(ch)) {
177 bool term::PeculiarIdentifier::operator()(reader::IReader* reader,
178 unsigned int* size) {
179 unicode::UniChar ch(reader->Peek());
180 if (ch.rawcode() == '+') {
183 } else if (ch.rawcode() == '-') {
184 unicode::UniString tmp(unicode::Convert(reader->Peek(2)));
185 if (tmp == unicode::Convert("->")) {
191 } else if (ch.rawcode() == '.') {
192 unicode::UniString tmp(unicode::Convert(reader->Peek(3)));
193 if (tmp == unicode::Convert("...")) {
202 bool term::ExponentMarker::operator()(reader::IReader* reader,
203 unsigned int* size) {
204 unicode::UniChar ch(reader->Peek());
205 switch (ch.rawcode()) {
224 bool term::Sign::operator()(reader::IReader* reader,
225 unsigned int* size) {
226 unicode::UniChar ch(reader->Peek());
227 if (ch.rawcode() == '+' || ch.rawcode() == '-') {
236 bool term::Exactness::operator()(reader::IReader* reader,
237 unsigned int* size) {
238 unicode::UniString str(unicode::Convert(reader->Peek(2)));
239 if (str == unicode::Convert("#e") || str == unicode::Convert("#E") ||
240 str == unicode::Convert("#i") || str == unicode::Convert("#I")) {
249 bool term::Naninf::operator()(reader::IReader* reader,
250 unsigned int* size) {
251 unicode::UniString code(unicode::Convert(reader->Peek(kNaninfSize)));
252 if (code == unicode::Convert("nan.0") || code == unicode::Convert("inf.0")) {
260 bool term::Boolean::operator()(reader::IReader* reader, unsigned int* size) {
261 unicode::UniString code(unicode::Convert(reader->Peek(kBooleanReadSize)));
262 if (code == unicode::Convert("#f") || code == unicode::Convert("#F") ||
263 code == unicode::Convert("#t") || code == unicode::Convert("#T")) {
264 *size = kBooleanReadSize;
271 bool term::DatumComment::operator()(reader::IReader* reader,
272 unsigned int* size) {
273 unicode::UniString code(unicode::Convert(
274 reader->Peek(kDatumCommentReadSize)));
275 if (code == unicode::Convert("#;")) {
276 *size = kDatumCommentReadSize;
283 bool term::SpecialComment::operator()(reader::IReader* reader,
284 unsigned int* size) {
285 unicode::UniString code(unicode::Convert(
286 reader->Peek(kSpecialCommentReadSize)));
287 if (code == unicode::Convert("#!r6rs")) {
288 *size = kSpecialCommentReadSize;