From 3ccfbedc7be9bc7f8d7068e71fc23003a4aa9af9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0torc?= <storcond@fit.cvut.cz>
Date: Mon, 27 Mar 2023 13:16:38 +0200
Subject: [PATCH] cli: Adjust grammar for auto complete

---
 alib2cli/src/grammar/AltCliParser.g4          | 41 ++++++++++++++-----
 alib2cli/src/parser/AltVisitor.Arg.cpp        | 25 +++++++++--
 alib2cli/src/parser/AltVisitor.Command.cpp    | 17 ++++----
 alib2cli/src/parser/AltVisitor.Expression.cpp |  2 +-
 alib2cli/src/parser/AltVisitor.Statement.cpp  |  9 ++--
 alib2cli/src/parser/AltVisitor.h              |  4 ++
 6 files changed, 71 insertions(+), 27 deletions(-)

diff --git a/alib2cli/src/grammar/AltCliParser.g4 b/alib2cli/src/grammar/AltCliParser.g4
index 0f24b5c6d..c0e882729 100644
--- a/alib2cli/src/grammar/AltCliParser.g4
+++ b/alib2cli/src/grammar/AltCliParser.g4
@@ -10,7 +10,7 @@ parse
 	| NEWLINE* EOF;
 
 arg
-	:	HASH_SIGN ( INTEGER | IDENTIFIER )
+	:	HASH_SIGN binding
 	|	IDENTIFIER
 	;
 
@@ -19,7 +19,7 @@ template_arg
 	;
 
 file
-	:	HASH_SIGN ( INTEGER | IDENTIFIER )
+	:	HASH_SIGN binding
 	|	STRING
 	//|	FILE
 	| IDENTIFIER
@@ -37,16 +37,16 @@ in_redirect
 	;
 
 out_redirect
-	:	DOLAR_SIGN arg # ResultVariableStatement
+	:	variable # ResultVariableStatement
 	|	( LEFT_BRACKET arg RIGHT_BRACKET )? file # ResultFileStatement
 	;
 
 common
-	:	DOLAR_SIGN arg # VariableStatement
+	:	variable # VariableStatement
 	|	LESS_SIGN in_redirect # InRedirectStatement
 	|	STRING # ImmediateStatement
 	|	INTEGER # ImmediateStatement
-	|	HASH_SIGN ( INTEGER | IDENTIFIER ) # ValueStatement
+	|	HASH_SIGN binding # ValueStatement
 	|	LEFT_BRACE ( param ) * RIGHT_BRACE # ContainerStatement
 	;
 
@@ -89,18 +89,26 @@ introspect_cast_from_to
 	;
 
 introspect_command
-	:	KW_ALGORITHMS arg? #IntrospectAlgorithms
+	:	KW_ALGORITHMS algorithm_group? #IntrospectAlgorithms
 	|	KW_OVERLOADS arg template_arg* # IntrospectOverloads
 	|	KW_OPERATORS # IntrospectOperators
-	|	KW_DATATYPES arg? # IntrospectDatatypes
+	|	KW_DATATYPES datatype_group? # IntrospectDatatypes
 	|	KW_CASTS introspect_cast_from_to arg? # IntrospectCasts
 	|	KW_NORMALIZATIONS # IntrospectNormalizations
 	|	KW_DENORMALIZATIONS # IntrospectDeormalizations
-	|	KW_VARIABLES ( DOLAR_SIGN arg )? # IntrospectVariables
-	|	KW_BINDINGS arg? # IntrospectBindings
+	|	KW_VARIABLES variable? # IntrospectVariables
+	|	KW_BINDINGS (HASH_SIGN? binding)? # IntrospectBindings
 	|	KW_AST command # IntrospectAst
 	;
 
+algorithm_group
+    : arg
+    ;
+
+datatype_group
+    : arg
+    ;
+
 batch
     : statement_list
     ;
@@ -192,7 +200,7 @@ atom
 	:	(KW_TYPE | KW_ACTUAL_TYPE) LEFT_PAREN expression RIGHT_PAREN # ActualTypeExpression
 	|	KW_DECLARED_TYPE LEFT_PAREN expression RIGHT_PAREN # ActualTypeExpression
 	|	IDENTIFIER bracketed_expression_list # FunctionCallExpression
-	|	DOLAR_SIGN arg # VariableExpression
+	|	variable # VariableExpression
 	|	LEFT_PAREN expression RIGHT_PAREN # AtomExpression
 	|	STRING # ImmediateExpression
 	|	INTEGER # ImmediateExpression
@@ -213,3 +221,16 @@ type_option
 option
     : (COLON_SIGN (IDENTIFIER | INTEGER))
     ;
+
+variable
+    : DOLAR_SIGN arg
+    ;
+
+binding
+    : INTEGER
+    | IDENTIFIER
+    ;
+
+identifier
+    : KW_TREE | IDENTIFIER
+    ;
\ No newline at end of file
diff --git a/alib2cli/src/parser/AltVisitor.Arg.cpp b/alib2cli/src/parser/AltVisitor.Arg.cpp
index 6848ba070..9fdd16936 100644
--- a/alib2cli/src/parser/AltVisitor.Arg.cpp
+++ b/alib2cli/src/parser/AltVisitor.Arg.cpp
@@ -10,9 +10,7 @@ std::any AltVisitor::visitArg(AltCliParser::ArgContext* ctx)
         return retPtr<Arg, ImmediateArg>(ctx->IDENTIFIER()->getText());
     }
 
-    auto* argContent = pickNonNull(ctx->IDENTIFIER(), ctx->INTEGER());
-
-    return retPtr<Arg, BindedArg>(argContent->getText());
+    return visitBinding(ctx->binding());
 }
 
 std::any AltVisitor::visitType(AltCliParser::TypeContext* ctx)
@@ -31,4 +29,25 @@ std::any AltVisitor::visitType(AltCliParser::TypeContext* ctx)
 
     throw std::logic_error("Invalid Type");
 }
+
+std::any AltVisitor::visitVariable(AltCliParser::VariableContext* ctx)
+{
+    return visit(ctx->arg());
+}
+
+std::any AltVisitor::visitBinding(AltCliParser::BindingContext* ctx)
+{
+    auto* argContent = pickNonNull(ctx->IDENTIFIER(), ctx->INTEGER());
+    return retPtr<Arg, BindedArg>(argContent->getText());
+}
+
+std::any AltVisitor::visitAlgorithm_group(AltCliParser::Algorithm_groupContext* ctx)
+{
+    return visit(ctx->arg());
+}
+
+std::any AltVisitor::visitDatatype_group(AltCliParser::Datatype_groupContext* ctx)
+{
+    return visit(ctx->arg());
 }
+}
\ No newline at end of file
diff --git a/alib2cli/src/parser/AltVisitor.Command.cpp b/alib2cli/src/parser/AltVisitor.Command.cpp
index 0af74b736..07eda0476 100644
--- a/alib2cli/src/parser/AltVisitor.Command.cpp
+++ b/alib2cli/src/parser/AltVisitor.Command.cpp
@@ -91,6 +91,7 @@ std::any AltVisitor::visitBlock(AltCliParser::BlockContext* ctx)
     incNestedLevel();
 
     ext::vector<std::unique_ptr<Command>> list;
+
     fillList<Command>(list, ctx->semicolon_command());
 
     decNestedLevel();
@@ -378,8 +379,8 @@ std::any AltVisitor::visitIntrospectAst(AltCliParser::IntrospectAstContext* ctx)
 std::any AltVisitor::visitIntrospectAlgorithms(AltCliParser::IntrospectAlgorithmsContext* ctx)
 {
     std::unique_ptr<Arg> arg;
-    if (ctx->arg() != nullptr)
-        arg = castToUnique<Arg>(visit(ctx->arg()));
+    if (ctx->algorithm_group() != nullptr)
+        arg = castToUnique<Arg>(visit(ctx->algorithm_group()));
 
     return retPtr<Command, AlgorithmsIntrospectionCommand>(std::move(arg));
 }
@@ -402,8 +403,8 @@ std::any AltVisitor::visitIntrospectOperators(AltCliParser::IntrospectOperatorsC
 std::any AltVisitor::visitIntrospectDatatypes(AltCliParser::IntrospectDatatypesContext* ctx)
 {
     std::unique_ptr<Arg> arg;
-    if (ctx->arg() != nullptr)
-        arg = castToUnique<Arg>(visit(ctx->arg()));
+    if (ctx->datatype_group() != nullptr)
+        arg = castToUnique<Arg>(visit(ctx->datatype_group()));
 
     return retPtr<Command, DataTypesIntrospectionCommand>(std::move(arg));
 }
@@ -442,8 +443,8 @@ std::any AltVisitor::visitIntrospectDeormalizations(AltCliParser::IntrospectDeor
 std::any AltVisitor::visitIntrospectVariables(AltCliParser::IntrospectVariablesContext* ctx)
 {
     std::unique_ptr<Arg> arg;
-    if (ctx->arg() != nullptr)
-        arg = castToUnique<Arg>(visit(ctx->arg()));
+    if (ctx->variable() != nullptr)
+        arg = castToUnique<Arg>(visit(ctx->variable()));
 
     return retPtr<Command, VariablesIntrospectionCommand>(std::move(arg));
 }
@@ -451,8 +452,8 @@ std::any AltVisitor::visitIntrospectVariables(AltCliParser::IntrospectVariablesC
 std::any AltVisitor::visitIntrospectBindings(AltCliParser::IntrospectBindingsContext* ctx)
 {
     std::unique_ptr<Arg> arg;
-    if (ctx->arg() != nullptr)
-        arg = castToUnique<Arg>(visit(ctx->arg()));
+    if (ctx->binding() != nullptr)
+        arg = castToUnique<Arg>(visit(ctx->binding()));
 
     return retPtr<Command, BindingsIntrospectionCommand>(std::move(arg));
 }
diff --git a/alib2cli/src/parser/AltVisitor.Expression.cpp b/alib2cli/src/parser/AltVisitor.Expression.cpp
index 3e29e07e4..fc1b884bf 100644
--- a/alib2cli/src/parser/AltVisitor.Expression.cpp
+++ b/alib2cli/src/parser/AltVisitor.Expression.cpp
@@ -107,7 +107,7 @@ std::any AltVisitor::visitFunctionCallExpression(AltCliParser::FunctionCallExpre
 
 std::any AltVisitor::visitVariableExpression(AltCliParser::VariableExpressionContext* ctx)
 {
-    auto name = castToUnique<Arg>(visit(ctx->arg()));
+    auto name = castToUnique<Arg>(visit(ctx->variable()));
 
     return retPtr<Expression, VariableExpression>(std::move(name));
 }
diff --git a/alib2cli/src/parser/AltVisitor.Statement.cpp b/alib2cli/src/parser/AltVisitor.Statement.cpp
index d7ae72077..dc5d74877 100644
--- a/alib2cli/src/parser/AltVisitor.Statement.cpp
+++ b/alib2cli/src/parser/AltVisitor.Statement.cpp
@@ -102,7 +102,7 @@ std::any AltVisitor::visitImmediateParam(AltCliParser::ImmediateParamContext* ct
 
 std::any AltVisitor::visitResultVariableStatement(AltCliParser::ResultVariableStatementContext* ctx)
 {
-    auto arg = castToUnique<Arg>(visit(ctx->arg()));
+    auto arg = castToUnique<Arg>(visit(ctx->variable()));
 
     return retPtr<Statement, ResultVariableStatement>(std::move(arg));
 }
@@ -121,7 +121,7 @@ std::any AltVisitor::visitResultFileStatement(AltCliParser::ResultFileStatementC
 
 std::any AltVisitor::visitVariableStatement(AltCliParser::VariableStatementContext* ctx)
 {
-    auto arg = castToUnique<Arg>(visit(ctx->arg()));
+    auto arg = castToUnique<Arg>(visit(ctx->variable()));
     return retPtr<Statement, VariableStatement>(std::move(arg));
 }
 
@@ -135,8 +135,7 @@ std::any AltVisitor::visitCastParam(AltCliParser::CastParamContext* ctx)
 
 std::any AltVisitor::visitValueStatement(AltCliParser::ValueStatementContext* ctx)
 {
-    auto* arg = pickNonNull(ctx->IDENTIFIER(), ctx->INTEGER());
-
-    return retPtr<Statement, ValueStatement>(std::make_unique<BindedArg>(arg->getText()));
+    auto binding = castToUnique<BindedArg>(visit(ctx->binding()));
+    return retPtr<Statement, ValueStatement>(std::move(binding));
 }
 }
diff --git a/alib2cli/src/parser/AltVisitor.h b/alib2cli/src/parser/AltVisitor.h
index 6fb478fa6..c00644342 100644
--- a/alib2cli/src/parser/AltVisitor.h
+++ b/alib2cli/src/parser/AltVisitor.h
@@ -168,6 +168,10 @@ struct AltVisitor : public AltCliParserBaseVisitor {
     std::any visitIntrospectVariables(AltCliParser::IntrospectVariablesContext* ctx) override;
 
     std::any visitIntrospectBindings(AltCliParser::IntrospectBindingsContext* ctx) override;
+    std::any visitVariable(AltCliParser::VariableContext* ctx) override;
+    std::any visitBinding(AltCliParser::BindingContext* ctx) override;
+    std::any visitAlgorithm_group(AltCliParser::Algorithm_groupContext* ctx) override;
+    std::any visitDatatype_group(AltCliParser::Datatype_groupContext* ctx) override;
 
 private:
     size_t nestedLevel = 0;
-- 
GitLab