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