#pragma once #include "molasses/lexer.h" #include "molasses/parser_primitives.h" #include #include #include 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 identify(molasses::parser_context& ctx, const molasses::lexed_output& lexer_data, std::span current) = 0; }; struct ast_node { virtual std::vector apply(molasses::parser_context& ctx, const molasses::lexed_output& lexer_data, std::span current) = 0; }; struct parser_branch : public parser { std::vector> choice; }; struct parser_sequence : public parser { std::vector> sequence; };