58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "CommandTypes.h"
|
|
#include "Execute.h"
|
|
#include "Token.h"
|
|
|
|
#include <BAN/Function.h>
|
|
#include <BAN/NoCopyMove.h>
|
|
#include <BAN/Optional.h>
|
|
#include <BAN/Queue.h>
|
|
#include <BAN/Vector.h>
|
|
|
|
class TokenParser
|
|
{
|
|
BAN_NON_COPYABLE(TokenParser);
|
|
BAN_NON_MOVABLE(TokenParser);
|
|
public:
|
|
using InputFunction = BAN::Function<BAN::Optional<BAN::String>(BAN::Optional<BAN::StringView>)>;
|
|
|
|
public:
|
|
TokenParser(const InputFunction& input_function)
|
|
: m_input_function(input_function)
|
|
{ }
|
|
|
|
Execute& execute() { return m_execute; }
|
|
const Execute& execute() const { return m_execute; }
|
|
|
|
[[nodiscard]] bool main_loop(bool break_on_error);
|
|
|
|
private:
|
|
const Token& peek_token() const;
|
|
Token read_token();
|
|
void consume_token();
|
|
|
|
BAN::ErrorOr<void> feed_tokens(BAN::Vector<Token>&& tokens);
|
|
BAN::ErrorOr<void> unget_token(Token&& token);
|
|
|
|
BAN::ErrorOr<void> ask_input_tokens(BAN::StringView prompt, bool add_newline);
|
|
|
|
BAN::ErrorOr<void> run(BAN::Vector<Token>&&);
|
|
|
|
BAN::ErrorOr<CommandArgument::ArgumentPart> parse_backslash(bool is_quoted);
|
|
BAN::ErrorOr<CommandArgument::ArgumentPart> parse_dollar();
|
|
BAN::ErrorOr<CommandArgument::ArgumentPart> parse_single_quote();
|
|
BAN::ErrorOr<CommandArgument> parse_argument();
|
|
|
|
BAN::ErrorOr<SingleCommand> parse_single_command();
|
|
BAN::ErrorOr<PipedCommand> parse_piped_command();
|
|
BAN::ErrorOr<CommandTree> parse_command_tree();
|
|
|
|
private:
|
|
Execute m_execute;
|
|
|
|
Token m_eof_token { Token::Type::EOF_ };
|
|
BAN::Queue<BAN::Vector<Token>> m_token_stream;
|
|
InputFunction m_input_function;
|
|
};
|