From 360422cef1c889a9b0c51aab0004b7f0159c12b5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 9 May 2024 21:48:39 +0300 Subject: [PATCH] CommandsInterpreter::parse --- src/logic/CommandsInterpreter.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/logic/CommandsInterpreter.cpp b/src/logic/CommandsInterpreter.cpp index 47a44307..8e157d69 100644 --- a/src/logic/CommandsInterpreter.cpp +++ b/src/logic/CommandsInterpreter.cpp @@ -11,6 +11,10 @@ inline bool is_cmd_identifier_part(char c) { return is_identifier_part(c) || c == '.' || c == '$' || c == '@'; } +inline bool is_cmd_identifier_start(char c) { + return is_identifier_start(c) || c == '.' || c == '$' || c == '@'; +} + class CommandParser : BasicParser { std::string parseIdentifier() { char c = peek(); @@ -57,7 +61,7 @@ public: dynamic::Value parseValue() { char c = peek(); - if (is_cmd_identifier_part(c)) { + if (is_cmd_identifier_start(c)) { auto str = parseIdentifier(); if (str == "true") { return true; @@ -155,8 +159,20 @@ public: CommandInput parsePrompt() { std::string name = parseIdentifier(); + auto args = dynamic::create_list(); + auto kwargs = dynamic::create_map(); - return CommandInput {name, nullptr, nullptr}; + while (hasNext()) { + auto value = parseValue(); + if (hasNext() && peek() == '=') { + auto key = std::get(value); + nextChar(); + kwargs->put(key, parseValue()); + } + args->put(value); + } + + return CommandInput {name, args, kwargs}; } };