37 explicit Parser(
unsigned debug,
bool interpret =
true);
44 void process(
const std::string& filename,
const std::string& code);
50 [[nodiscard]]
const Node& ast()
const noexcept;
56 [[nodiscard]]
const std::vector<Import>& imports()
const;
65 std::vector<std::function<std::optional<Node>()>>
m_parsers;
73 Node& setNodePosAndFilename(
Node& node,
const std::optional<FilePosition>& cursor = std::nullopt)
const;
75 std::optional<Node> node();
76 std::optional<Node> letMutSet();
77 std::optional<Node> del();
78 std::optional<Node> condition();
79 std::optional<Node> loop();
80 std::optional<Node> import_();
81 std::optional<Node> block();
82 std::optional<Node> functionArgs();
83 std::optional<Node> function();
84 std::optional<Node> macroCondition();
85 std::optional<Node> macroArgs();
86 std::optional<Node> macro();
87 std::optional<Node> functionCall();
88 std::optional<Node> list();
92 auto pos = getCount();
95 if (signedNumber(&res))
98 if (Utils::isDouble(res, &output))
99 return std::optional<Node>(output);
101 error(
"Is not a valid number", res);
120 else if (accept(
IsChar(
'\\')))
122 else if (accept(
IsChar(
'n')))
123 res += m_interpret ?
'\n' :
'n';
124 else if (accept(
IsChar(
't')))
125 res += m_interpret ?
'\t' :
't';
126 else if (accept(
IsChar(
'v')))
127 res += m_interpret ?
'\v' :
'v';
128 else if (accept(
IsChar(
'r')))
129 res += m_interpret ?
'\r' :
'r';
130 else if (accept(
IsChar(
'a')))
131 res += m_interpret ?
'\a' :
'a';
132 else if (accept(
IsChar(
'b')))
133 res += m_interpret ?
'\b' :
'b';
134 else if (accept(
IsChar(
'f')))
135 res += m_interpret ?
'\f' :
'f';
136 else if (accept(
IsChar(
'u')))
139 if (hexNumber(4, &seq))
145 if (*utf8_str ==
'\0')
146 error(
"Invalid escape sequence",
"\\u" + seq);
153 error(
"Invalid escape sequence",
"\\u");
155 else if (accept(
IsChar(
'U')))
158 if (hexNumber(8, &seq))
162 std::size_t begin = 0;
163 for (; seq[begin] ==
'0'; ++begin)
167 if (*utf8_str ==
'\0')
168 error(
"Invalid escape sequence",
"\\U" + seq);
175 error(
"Invalid escape sequence",
"\\U");
179 backtrack(getCount() - 1);
180 error(
"Unknown escape sequence",
"\\");
189 expectSuffixOrError(
'"',
"after string");
192 return {
Node(NodeType::String, res) };
203 std::optional<Node> leaf {
Node(NodeType::Field) };
204 setNodePosAndFilename(leaf.value());
205 leaf->push_back(
Node(NodeType::Symbol, sym));
209 if (leaf->list().size() == 1 && !accept(
IsChar(
'.')))
212 if (leaf->list().size() > 1 && !accept(
IsChar(
'.')))
216 errorWithNextToken(
"Expected a field name: <symbol>.<field>");
217 leaf->push_back(
Node(NodeType::Symbol, res));
228 return {
Node(NodeType::Symbol, res) };
237 errorWithNextToken(
"Expected a name for the variadic");
238 return {
Node(NodeType::Spread, res) };
249 newlineOrComment(&comment);
262 std::optional<Node> atom();
269 std::optional<Node> anyAtomOf(std::initializer_list<NodeType> types);
275 std::optional<Node> nodeOrValue();
283 std::optional<Node> wrapped(std::optional<Node> (
Parser::*parser)(),
const std::string& name);