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;
72 Node& setNodePosAndFilename(
Node& node,
const std::optional<FilePosition>& cursor = std::nullopt)
const;
74 std::optional<Node> node();
75 std::optional<Node> letMutSet();
76 std::optional<Node> del();
77 std::optional<Node> condition();
78 std::optional<Node> loop();
79 std::optional<Node> import_();
80 std::optional<Node> block();
81 std::optional<Node> functionArgs();
82 std::optional<Node> function();
83 std::optional<Node> macroCondition();
84 std::optional<Node> macroArgs();
85 std::optional<Node> macro();
86 std::optional<Node> functionCall();
87 std::optional<Node> list();
91 auto pos = getCount();
94 if (signedNumber(&res))
97 if (Utils::isDouble(res, &output))
98 return std::optional<Node>(output);
100 error(
"Is not a valid number", res);
119 else if (accept(
IsChar(
'\\')))
121 else if (accept(
IsChar(
'n')))
122 res += m_interpret ?
'\n' :
'n';
123 else if (accept(
IsChar(
't')))
124 res += m_interpret ?
'\t' :
't';
125 else if (accept(
IsChar(
'v')))
126 res += m_interpret ?
'\v' :
'v';
127 else if (accept(
IsChar(
'r')))
128 res += m_interpret ?
'\r' :
'r';
129 else if (accept(
IsChar(
'a')))
130 res += m_interpret ?
'\a' :
'a';
131 else if (accept(
IsChar(
'b')))
132 res += m_interpret ?
'\b' :
'b';
133 else if (accept(
IsChar(
'f')))
134 res += m_interpret ?
'\f' :
'f';
135 else if (accept(
IsChar(
'u')))
138 if (hexNumber(4, &seq))
144 if (*utf8_str ==
'\0')
145 error(
"Invalid escape sequence",
"\\u" + seq);
152 error(
"Invalid escape sequence",
"\\u");
154 else if (accept(
IsChar(
'U')))
157 if (hexNumber(8, &seq))
161 std::size_t begin = 0;
162 for (; seq[begin] ==
'0'; ++begin)
166 if (*utf8_str ==
'\0')
167 error(
"Invalid escape sequence",
"\\U" + seq);
174 error(
"Invalid escape sequence",
"\\U");
178 backtrack(getCount() - 1);
179 error(
"Unknown escape sequence",
"\\");
188 errorMissingSuffix(
'"',
"string");
191 return {
Node(NodeType::String, res) };
202 std::optional<Node> leaf {
Node(NodeType::Field) };
203 setNodePosAndFilename(leaf.value());
204 leaf->push_back(
Node(NodeType::Symbol, sym));
208 if (leaf->list().size() == 1 && !accept(
IsChar(
'.')))
211 if (leaf->list().size() > 1 && !accept(
IsChar(
'.')))
215 errorWithNextToken(
"Expected a field name: <symbol>.<field>");
216 leaf->push_back(
Node(NodeType::Symbol, res));
227 return {
Node(NodeType::Symbol, res) };
236 errorWithNextToken(
"Expected a name for the variadic");
237 return {
Node(NodeType::Spread, res) };
248 newlineOrComment(&comment);
261 std::optional<Node> atom();
268 std::optional<Node> anyAtomOf(std::initializer_list<NodeType> types);
274 std::optional<Node> nodeOrValue();
282 std::optional<Node> wrapped(std::optional<Node> (
Parser::*parser)(),
const std::string& name);