38 explicit Parser(
unsigned debug,
bool interpret =
true);
45 void process(
const std::string& filename,
const std::string& code);
51 [[nodiscard]]
const Node& ast()
const noexcept;
57 [[nodiscard]]
const std::vector<Import>& imports()
const;
66 std::vector<std::function<std::optional<Node>()>>
m_parsers;
74 Node& setNodePosAndFilename(
Node& node,
const std::optional<FilePosition>& cursor = std::nullopt)
const;
76 std::optional<Node> node();
77 std::optional<Node> letMutSet();
78 std::optional<Node> del();
79 std::optional<Node> condition();
80 std::optional<Node> loop();
81 std::optional<Node> import_();
82 std::optional<Node> block();
83 std::optional<Node> functionArgs();
84 std::optional<Node> function();
85 std::optional<Node> macroCondition();
86 std::optional<Node> macroArgs();
87 std::optional<Node> macro();
88 std::optional<Node> functionCall();
89 std::optional<Node> list();
93 auto pos = getCount();
96 if (signedNumber(&res))
99 if (Utils::isDouble(res, &output))
100 return std::optional<Node>(output);
102 error(
"Is not a valid number", res);
121 else if (accept(
IsChar(
'\\')))
123 else if (accept(
IsChar(
'n')))
124 res += m_interpret ?
'\n' :
'n';
125 else if (accept(
IsChar(
't')))
126 res += m_interpret ?
'\t' :
't';
127 else if (accept(
IsChar(
'v')))
128 res += m_interpret ?
'\v' :
'v';
129 else if (accept(
IsChar(
'r')))
130 res += m_interpret ?
'\r' :
'r';
131 else if (accept(
IsChar(
'a')))
132 res += m_interpret ?
'\a' :
'a';
133 else if (accept(
IsChar(
'b')))
134 res += m_interpret ?
'\b' :
'b';
135 else if (accept(
IsChar(
'f')))
136 res += m_interpret ?
'\f' :
'f';
137 else if (accept(
IsChar(
'u')))
140 if (hexNumber(4, &seq))
146 if (*utf8_str ==
'\0')
147 error(
"Invalid escape sequence",
"\\u" + seq);
154 error(
"Invalid escape sequence",
"\\u");
156 else if (accept(
IsChar(
'U')))
159 if (hexNumber(8, &seq))
163 std::size_t begin = 0;
164 for (; seq[begin] ==
'0'; ++begin)
168 if (*utf8_str ==
'\0')
169 error(
"Invalid escape sequence",
"\\U" + seq);
176 error(
"Invalid escape sequence",
"\\U");
180 backtrack(getCount() - 1);
181 error(
"Unknown escape sequence",
"\\");
190 expectSuffixOrError(
'"',
"after string");
193 return {
Node(NodeType::String, res) };
204 std::optional<Node> leaf {
Node(NodeType::Field) };
205 setNodePosAndFilename(leaf.value());
206 leaf->push_back(
Node(NodeType::Symbol, sym));
210 if (leaf->list().size() == 1 && !accept(
IsChar(
'.')))
213 if (leaf->list().size() > 1 && !accept(
IsChar(
'.')))
217 errorWithNextToken(
"Expected a field name: <symbol>.<field>");
218 leaf->push_back(
Node(NodeType::Symbol, res));
229 return {
Node(NodeType::Symbol, res) };
238 errorWithNextToken(
"Expected a name for the variadic");
239 return {
Node(NodeType::Spread, res) };
250 newlineOrComment(&comment);
263 std::optional<Node> atom();
270 std::optional<Node> anyAtomOf(std::initializer_list<NodeType> types);
276 std::optional<Node> nodeOrValue();
284 std::optional<Node> wrapped(std::optional<Node> (
Parser::*parser)(),
const std::string& name);