sm_parsers: instr parser

This commit is contained in:
ProgramSnail 2025-05-24 15:00:06 +03:00
parent 9563485f8f
commit c348af161c

View file

@ -201,7 +201,7 @@ ParsingResult parse_var(std::string_view s) {
} }
// (_, _) // (_, _)
ParsingResult parse_pair(std::string_view s) { // TODO ParsingResult parse_pair(std::string_view s) {
if (s.size() < 2 || s.front() != '(') { if (s.size() < 2 || s.front() != '(') {
return {}; return {};
} }
@ -215,13 +215,13 @@ ParsingResult parse_pair(std::string_view s) { // TODO
} }
// [_, ..., _] // [_, ..., _]
ParsingResult parse_array(std::string_view s) { // TODO ParsingResult parse_array(std::string_view s, char first_symbol = '[') {
if (s.size() < 2 || s.front() != '[') { if (s.size() < 2 || s.front() != first_symbol) {
return {}; return {};
} }
std::vector<std::any> values; std::vector<std::any> values;
ParsingResult res{{}, s.substr(1)}; // skip '[' ParsingResult res{{}, s.substr(1)}; // skip '[' (first_symbol)
while (not s.empty()) { while (not s.empty()) {
res = parse_any_val(res.rest); res = parse_any_val(res.rest);
@ -521,51 +521,25 @@ std::optional<SMInstr> parse_sm(const std::string &line) {
return instr.build(); return instr.build();
} }
// NOTE: do not check for valid input // (_, ..., _) - args
// if (auto space = std::string{substr_to(line, pos, '(')}; space != " ") { ParsingResult args_res = parse_array({line.data(), line.data() + pos});
// return std::nullopt;
// }
// TODO: Automatically parse any structures with parser combinators try {
// if (cmd == "BEGIN") { auto args = std::any_cast<std::vector<std::any>>(std::move(args_res.value));
// // TODO: BEGIN args_res.value = {};
// } else {
// bool was_last_arg = false; if (not args_res.rest.empty()) {
// while (!was_last_arg) { return std::nullopt;
// std::string arg = substr_to(line, pos, '('); }
// ++pos;
// if (arg.empty()) { // TODO: put all array at once
// arg = line.substr(pos); for (auto &&arg : args) {
// arg.pop_back(); // ')' instr.push_arg(arg);
// was_last_arg = true; }
// } args = {};
} catch (const std::bad_any_cast &) {
// if (arg.front() == '"') { return std::nullopt;
// instr.push_arg(arg.substr(1, arg.size() - 2)); }
// } else if (arg.front() == '[') {
// // TODO: parse array
// instr.push_arg(arg.substr(1, arg.size() - 2));
// } else if (arg == "true") {
// instr.push_arg(true);
// } else if (arg == "false") {
// instr.push_arg(false);
// } else if (auto maybe_var = parse_var(arg); maybe_var) {
// instr.push_arg(*maybe_var);
// } else if () { // TODO: CLUSURE vector
// } else if (auto maybe_patt = parse_patt(arg); maybe_patt) {
// instr.push_arg(*maybe_patt);
// } else if (int n = 0; std::from_chars(line.data() + pos,
// line.data() + pos +
// line.size(), n)
// .ec == std::errc{}) {
// instr.push_arg(n);
// } else {
// return std::nullopt;
// }
// }
// }
return instr.build(); return instr.build();
} }