|
|
- #pragma once
- #include "molasses/lexer.h"
- #include "molasses/parser_primitives.h"
- #include <memory>
- #include <span>
- #include <vector>
-
- struct parser {
- /**
- *
- * @param ctx
- * @param lexer_data
- * @param current
- * @return a span of the tokens left before reaching the target, assuming the parser is as greedy as possible
- */
- virtual std::span<molasses::symbol> identify(molasses::parser_context& ctx, const molasses::lexed_output& lexer_data, std::span<molasses::symbol> current) = 0;
- };
-
- struct ast_node {
- virtual std::vector<molasses::symbol> apply(molasses::parser_context& ctx, const molasses::lexed_output& lexer_data, std::span<molasses::symbol> current) = 0;
- };
-
- struct parser_branch : public parser {
- std::vector<std::shared_ptr<parser>> choice;
- };
-
- struct parser_sequence : public parser {
- std::vector<std::shared_ptr<parser>> sequence;
- };
|