From b3f75ae3d8b43f5ecd79c63d4f11ab853a6434c1 Mon Sep 17 00:00:00 2001 From: Pimpest <82343504+Pimpest@users.noreply.github.com> Date: Fri, 6 Dec 2024 22:05:41 +0100 Subject: [PATCH] Added comments --- include/ast/ast.hpp | 4 +- include/ast/ast_base.hpp | 4 +- include/ast/ast_component.hpp | 2 +- include/ast/ast_executable.hpp | 2 +- include/ast/ast_token.hpp | 1 + include/cmd/args/arg.hpp | 4 ++ include/cmd/cmd.hpp | 4 +- include/cmd/cmd_base.hpp | 3 ++ include/fsh.hpp | 4 +- include/lexer.hpp | 11 ++-- include/util/input.hpp | 1 + include/util/text.hpp | 1 + src/cmd/arg.cpp | 2 + src/cmd/cmd_base.cpp | 2 +- util.hpp | 95 ++++++++++++++++++++++++++++++++++ 15 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 util.hpp diff --git a/include/ast/ast.hpp b/include/ast/ast.hpp index 9f71542..79e2fd8 100644 --- a/include/ast/ast.hpp +++ b/include/ast/ast.hpp @@ -29,7 +29,7 @@ namespace fsh { class AstFactory { public: - // Generates an abstract syntax tree + // Generise abstraktno sintaksno drvo po ebnf formuli gore static std::shared_ptr generate_ast(std::list& list) { auto it = list.begin(); return CommandLineNode::build(it); @@ -41,4 +41,4 @@ namespace fsh { AstFactory(const AstFactory&) = default; }; -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/ast/ast_base.hpp b/include/ast/ast_base.hpp index 06edf4c..c6fcbdc 100644 --- a/include/ast/ast_base.hpp +++ b/include/ast/ast_base.hpp @@ -33,6 +33,7 @@ namespace fsh { using TokenType = Lexer::TokenType; AstNode(NodeType type, std::string name) : type(type), name(name) {} + // Pokusa da napravi od narednih tokena zadati Node ako ne uspe vrati null template static std::shared_ptr Optional(std::list::iterator& it, std::shared_ptr& node_ptr); @@ -42,6 +43,7 @@ namespace fsh { return Optional(it, node_ptr); } + // Pravi od narednih tokena zadati Node ako ne uspe izbaci AstBuildError template static std::shared_ptr Mandatory(std::list::iterator& it) { return T::build(it); @@ -70,4 +72,4 @@ namespace fsh { AstBuildError(std::string err) : std::runtime_error(err) {} }; -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/ast/ast_component.hpp b/include/ast/ast_component.hpp index 7285079..30ce307 100644 --- a/include/ast/ast_component.hpp +++ b/include/ast/ast_component.hpp @@ -80,4 +80,4 @@ namespace fsh { bool append = false; }; -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/ast/ast_executable.hpp b/include/ast/ast_executable.hpp index b63eaae..8bd7e20 100644 --- a/include/ast/ast_executable.hpp +++ b/include/ast/ast_executable.hpp @@ -66,4 +66,4 @@ namespace fsh { std::shared_ptr pipe; }; -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/ast/ast_token.hpp b/include/ast/ast_token.hpp index 42f8dae..47f1d5d 100644 --- a/include/ast/ast_token.hpp +++ b/include/ast/ast_token.hpp @@ -6,6 +6,7 @@ namespace fsh { + // Genericni node namenjen kao wrapper za tokene template class TokenNode : public AstNode { public: diff --git a/include/cmd/args/arg.hpp b/include/cmd/args/arg.hpp index 328a2cc..9ca1421 100644 --- a/include/cmd/args/arg.hpp +++ b/include/cmd/args/arg.hpp @@ -34,21 +34,25 @@ namespace fsh { bool extends; //Not implemented }; + // Dodavanje argumenta koji sluzi za ulaz void add_input_rule() { has_input = true; pos_arg_rules.push_back({ &_Argument::create, false, false }); } + // Dodavanje pozicionog argumenta sa automatskim prebacivanjem template void add_rule(bool mandatory, bool extends = false) { pos_arg_rules.push_back({ &_Argument::create >, mandatory, extends }); } + // Dodavanje pravila za flag (sa mogucnoscu da se pokupi argument priljepljen npr. -n) template void add_rule(const std::string name, bool capturing = false) { flag_rules[name] = { _Argument::create >, false, capturing, false }; } + // Popunjava ArgManager (Mozda bolji naziv bi bio populate?) void parse(ArgManager& manager, ArgNodes& vec, FlagNode flag); bool ghas_input() { return has_input; } diff --git a/include/cmd/cmd.hpp b/include/cmd/cmd.hpp index ddcd5aa..2af8a17 100644 --- a/include/cmd/cmd.hpp +++ b/include/cmd/cmd.hpp @@ -12,6 +12,7 @@ namespace fsh { + // Ovaj singleton odrzava podatke o komanadama class CommandRegistry { public: static CommandRegistry& instance() { @@ -27,6 +28,7 @@ namespace fsh { Command& operator[](const std::string n) { return get(n); } private: + // Nove komande bi registrovali ovde: CommandRegistry() { cmds["wc"] = Command::register_cmd(); cmds["date"] = Command::register_cmd(); @@ -40,4 +42,4 @@ namespace fsh { std::unordered_map > cmds; }; -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/cmd/cmd_base.hpp b/include/cmd/cmd_base.hpp index a28a677..aa7de5b 100644 --- a/include/cmd/cmd_base.hpp +++ b/include/cmd/cmd_base.hpp @@ -27,7 +27,10 @@ namespace fsh { } protected: + // Register_flags se zove jednom pri registraciji komande i sluzi da u ArgFactory postavis + // pravila za argumente i opcije virtual void register_flags() {}; + // Korisnik u ovoj funkciju implementira glavnu funkcionalnost komande virtual void run(std::istream& in, std::ostream& out, ArgManager& args) {}; ArgFactory& get_factory() { return arg_factory; } diff --git a/include/fsh.hpp b/include/fsh.hpp index 61546a5..6d9188c 100644 --- a/include/fsh.hpp +++ b/include/fsh.hpp @@ -8,9 +8,11 @@ namespace fsh { + //Glavna singleton klasa za shell class fsh { public: - std::unordered_map environment; + std::unordered_map + environment; //Omogucava komandama da cuvaju informacije kroz upotrebe static fsh& instance() { static fsh f; diff --git a/include/lexer.hpp b/include/lexer.hpp index 5dcfb46..a04b0ea 100644 --- a/include/lexer.hpp +++ b/include/lexer.hpp @@ -6,13 +6,13 @@ namespace fsh { + // Ova klasa vrsi leksicku analizu ulaznog string-a class Lexer { public: enum TokenType { WHITESPACE, WORD, STRING_LITERAL, - OPT, FLAG, LREDIRECTION, RREDIRECTION, @@ -23,8 +23,11 @@ namespace fsh { using Token = std::pair; - int peek(); - int consume(); + // Daje nam sledeci karakter bez povecavanjem brojaca + int peek(); + // Daje nam sledeci karakter sa povecavanjem brojaca + int consume(); + // Trazi za sledeci token Token next_token(); static std::list process(std::string line); @@ -87,4 +90,4 @@ namespace fsh { return state; } -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/include/util/input.hpp b/include/util/input.hpp index fbedca7..7dbc213 100644 --- a/include/util/input.hpp +++ b/include/util/input.hpp @@ -7,6 +7,7 @@ #include #endif +// Neke "workarounds" za terminale na Unix i Windows namespace fsh::util { /** diff --git a/include/util/text.hpp b/include/util/text.hpp index 907c471..9a34251 100644 --- a/include/util/text.hpp +++ b/include/util/text.hpp @@ -5,6 +5,7 @@ #include #include +// Razlicite pomocne funkcije za tekstove namespace fsh::util { extern const char* tokens[]; diff --git a/src/cmd/arg.cpp b/src/cmd/arg.cpp index 87b0ded..be61d9d 100644 --- a/src/cmd/arg.cpp +++ b/src/cmd/arg.cpp @@ -26,6 +26,8 @@ namespace fsh { manager.push_arg(build_arg(pos_arg_rules[i].build, arg)); if (!pos_arg_rules[i].extends) i++; } + if (pos_arg_rules.size() > i && pos_arg_rules[i].mandatory) + throw std::invalid_argument("Excpected More arguments"); } void ArgFactory::parse_flag(ArgManager& manager, FlagNode flag) { diff --git a/src/cmd/cmd_base.cpp b/src/cmd/cmd_base.cpp index 976deaa..b5e9050 100644 --- a/src/cmd/cmd_base.cpp +++ b/src/cmd/cmd_base.cpp @@ -19,4 +19,4 @@ namespace fsh { in.clear(); } -} // namespace fsh \ No newline at end of file +} \ No newline at end of file diff --git a/util.hpp b/util.hpp new file mode 100644 index 0000000..356d84a --- /dev/null +++ b/util.hpp @@ -0,0 +1,95 @@ +/** CmakeLists.txt +cmake_minimum_required(VERSION 3.12) + +project(fsh LANGUAGES CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(FSH_SOURCE_FILES + src/main.cpp + src/fsh.cpp + src/lexer.cpp + src/ast/ast.cpp + src/ast/ast_exec.cpp + src/ast/ast_print.cpp + src/util/input.cpp + src/util/text.cpp + src/cmd/arg.cpp + src/cmd/cmd_base.cpp +) + +include_directories(include) + +add_executable(fsh ${FSH_SOURCE_FILES}) + */ + +/** .clang-format + +--- +Language: Cpp +BasedOnStyle: Mozilla + +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: true +AlignConsecutiveAssignments: true +AlignEscapedNewlines: Right +AlignOperands: false +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: true +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: true +AllowShortIfStatementsOnASingleLine: Always +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: false +BreakConstructorInitializers: AfterColon +ColumnLimit: 120 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +IncludeBlocks: Preserve +IndentCaseLabels: true +IndentWidth: 4 +PointerAlignment: Left +ReflowComments: false +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Auto +TabWidth: 4 +UseTab: Never + +AllowShortEnumsOnASingleLine: false + +BraceWrapping: + AfterEnum: false + +AlignConsecutiveDeclarations: + Enabled: true + +NamespaceIndentation: All + + */ \ No newline at end of file