forked from bolero-MURAKAMI/parser_like
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sentence_data.hpp
97 lines (88 loc) · 2.3 KB
/
sentence_data.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//DYZ parser generator
//(c)DtYaZsK 2014
#pragma once
#include<iterator>
#include<string>
#include<list>
#include<type_traits>
namespace dyz_parser
{
namespace parse_helper
{
struct token_holder_type{};
struct tuple_holder_type{};
struct space_holder_type{};
struct str_literal_type{};
enum class data_type
{
token, string, tuple, str_literal, space
};
struct data
{
std::string str_;
data_type type_;
data(token_holder_type) :type_(data_type::token){}
data(tuple_holder_type) :type_(data_type::tuple){}
data(space_holder_type) :type_(data_type::space){}
data(str_literal_type) :type_(data_type::str_literal){}
data(std::string str) :str_(str), type_(data_type::string){}
};
}
namespace placeholder
{
const parse_helper::token_holder_type token_holder{};
const parse_helper::tuple_holder_type tuple_holder{};
const parse_helper::space_holder_type space_holder{};
const parse_helper::str_literal_type string_literal_holder{};
}
struct sentence_data
{
std::list<parse_helper::data> sentence;
template<class T, class... Ts>void init_impl(T arg, Ts... args)
{
init_impl(args...);
sentence.emplace_front(arg);
}
void init_impl()
{
}
template<class... Ts>void init(Ts... args)
{
init_impl(args...);
if (sizeof...(Ts) <= 1)
return;
auto ite = sentence.begin();
auto before = sentence.begin();
++ite;
auto end = sentence.end();
for (; ite != end; ++ite)
{
before = std::prev(ite);
if ((*before).type_ == parse_helper::data_type::token &&
(*ite).type_ == parse_helper::data_type::token)
{
sentence.emplace(ite, " ");
sentence.emplace(ite, placeholder::space_holder);
}
else if ((*before).type_ == parse_helper::data_type::token &&
(*ite).type_ == parse_helper::data_type::string&&
token_string_check(*(*ite).str_.c_str()))
{
sentence.emplace(ite, " ");
sentence.emplace(ite, placeholder::space_holder);
}
else if((*ite).type_ == parse_helper::data_type::token &&
(*before).type_ == parse_helper::data_type::string &&
token_string_check(*(std::prev((*before).str_.end()))))
{
sentence.emplace(ite, " ");
sentence.emplace(ite, placeholder::space_holder);
}
}
}
template<class... Ts>explicit sentence_data(Ts... arg)
{
init(arg...);
}
};
}