diff --git a/include/ast/NodeValue.h b/include/ast/NodeValue.h index 2904a20ea233d9deda0a664118fded29377b987c..5ad9368f913d6547ae49fc37d36e1af5ab1dd1ff 100644 --- a/include/ast/NodeValue.h +++ b/include/ast/NodeValue.h @@ -102,7 +102,7 @@ public: auto& get_variant() const { return value; } private: - std::variant<int, double, bool, char, String, None> value; + std::variant<int, double, bool, char, String, None> value; ///< The stored value }; template <typename Op> NodeValue numeric_op(const NodeValue& lhs, const NodeValue& rhs, Op op); diff --git a/include/ast/UnaryOpNode.h b/include/ast/UnaryOpNode.h index 04da111694fcfbd22684bd48cc286fcc2b64b6ab..3a39f18bb4462576beb74645fa481a6a8bd1f2db 100644 --- a/include/ast/UnaryOpNode.h +++ b/include/ast/UnaryOpNode.h @@ -1,5 +1,5 @@ /** - * @file BinaryOpNode.h + * @file UnaryOpNode.h * @brief Defines the UnaryOpNode class for representing unary operations in the Funk AST. */ #pragma once diff --git a/include/parser/Parser.h b/include/parser/Parser.h index 287b64a9154043a1500bbf7e3c212a610e927cf3..4a5cda67c1bb3842d0da47f863a71bcc288064b4 100644 --- a/include/parser/Parser.h +++ b/include/parser/Parser.h @@ -1,3 +1,9 @@ +/** + * @file Parser.h + * @brief Definition of the Parser class for syntactic analysis in the Funk language + * This file defines the Parser class which performs syntactic analysis on + * a stream of tokens, converting them into an Abstract Syntax Tree (AST). + */ #pragma once #include "lexer/Lexer.h" @@ -11,42 +17,165 @@ namespace funk { +/** + * @brief Class responsible for syntactic analysis in the Funk language + * The Parser analyzes a stream of tokens according to the grammar rules + * of the Funk language and builds an Abstract Syntax Tree (AST) that + * represents the structure and semantics of the program. + */ class Parser { public: + /** + * @brief Constructs a parser for the given token stream + * @param tokens The tokens to parse + * @param filename The name of the file being processed (for error reporting) + */ Parser(const Vector<Token>& tokens, const String& filename); + + /** + * @brief Destructor for the Parser class + */ ~Parser(); + + /** + * @brief Parses the token stream and returns the root AST node + * @return Node* The root node of the parsed AST + */ Node* parse(); + /** + * @brief Creates a parser from a file + * @param filename The path to the file to parse + * @return Parser A parser initialized with tokens from the file + */ static Parser load(String filename); private: - Vector<Token> tokens; - String filename; - int index{0}; + Vector<Token> tokens; ///< The token stream to parse + String filename; ///< The name of the source file + int index{0}; ///< Current index in the token stream + /** + * @brief Advances the index and returns the token at the new index + * @return Token The next token + */ Token next(); + + /** + * @brief Returns the token at the current index without advancing + * @return Token The current token + */ Token peek() const; + + /** + * @brief Returns the token at the next index without advancing + * @return Token The next token + */ Token peek_next() const; + + /** + * @brief Returns the token at the previous index + * @return Token The previous token + */ Token peek_prev() const; + /** + * @brief Checks if the end of the token stream has been reached + * @return bool True if the parser has reached the end of the tokens + */ bool done() const; + + /** + * @brief Checks if the current token is of the expected type + * @param type The token type to check for + * @return bool True if the current token matches the expected type + */ bool check(TokenType type) const; + + /** + * @brief Checks if the current token matches the expected type, and advances if it does + * @param expected The token type to check for + * @return bool True if the current token matched and the index was advanced + */ bool match(TokenType expected); + /** + * @brief Parses a statement + * @return Node* The AST node representing the statement + */ Node* parse_statement(); + + /** + * @brief Parses an expression + * @return Node* The AST node representing the expression + */ Node* parse_expression(); + + /** + * @brief Parses an assignment expression + * @return Node* The AST node representing the assignment + */ Node* parse_assignment(); + /** + * @brief Parses a logical OR expression + * @return Node* The AST node representing the logical OR expression + */ Node* parse_logical_or(); + + /** + * @brief Parses a logical AND expression + * @return Node* The AST node representing the logical AND expression + */ Node* parse_logical_and(); + + /** + * @brief Parses an equality expression + * @return Node* The AST node representing the equality expression + */ Node* parse_equality(); + + /** + * @brief Parses a comparison expression + * @return Node* The AST node representing the comparison expression + */ Node* parse_comparison(); + + /** + * @brief Parses an additive expression + * @return Node* The AST node representing the additive expression + */ Node* parse_additive(); + + /** + * @brief Parses a multiplicative expression + * @return Node* The AST node representing the multiplicative expression + */ Node* parse_multiplicative(); + + /** + * @brief Parses a unary expression + * @return Node* The AST node representing the unary expression + */ Node* parse_unary(); + + /** + * @brief Parses a factor expression + * @return Node* The AST node representing the factor expression + */ Node* parse_factor(); + + /** + * @brief Parses a literal value + * @return Node* The AST node representing the literal value + */ Node* parse_literal(); + + /** + * @brief Parses an identifier + * @return Node* The AST node representing the identifier + */ Node* parse_identifier(); }; } // namespace funk diff --git a/include/utils/Exception.h b/include/utils/Exception.h index e8568566f140c31dcf31f849975c4d0450705c23..8c49376f72c1f1f398cd0d7e087b45b9bcec757f 100644 --- a/include/utils/Exception.h +++ b/include/utils/Exception.h @@ -56,6 +56,10 @@ public: * @param message Description of the error */ LexerError(const SourceLocation& loc, const String& message) : FunkError(loc, "Lexer error", message) {} + /** + * @brief Constructs a LexerError with a message. + * @param message Description of the error + */ LexerError(const String& message) : FunkError(SourceLocation{"", 0, 0}, "Lexer error", message) {} }; @@ -72,6 +76,10 @@ public: * @param message Description of the error */ SyntaxError(const SourceLocation& loc, const String& message) : FunkError(loc, "Syntax error", message) {} + /** + * @brief Constructs a SyntaxError with a message. + * @param message Description of the error + */ SyntaxError(const String& message) : FunkError(SourceLocation{"", 0, 0}, "Syntax error", message) {} }; @@ -88,6 +96,10 @@ public: * @param message Description of the error */ TypeError(const SourceLocation& loc, const String& message) : FunkError(loc, "Type error", message) {} + /** + * @brief Constructs a TypeError with a message. + * @param message Description of the error + */ TypeError(const String& message) : FunkError(SourceLocation{"", 0, 0}, "Type error", message) {} }; @@ -104,6 +116,10 @@ public: * @param message Description of the error */ RuntimeError(const SourceLocation& loc, const String& message) : FunkError(loc, "Runtime error", message) {} + /** + * @brief Constructs a RuntimeError with a message. + * @param message Description of the error + */ RuntimeError(const String& message) : FunkError(SourceLocation{"", 0, 0}, "Runtime error", message) {} }; diff --git a/source/main.cc b/source/main.cc index 8350180117f4e66da3954d2e2d116d59d790f6b4..ab7916d403445d22e31e37bf646296f64c4e0def 100644 --- a/source/main.cc +++ b/source/main.cc @@ -1,3 +1,11 @@ +/** + * @file main.cc + * @brief Main entry point for the Funk language interpreter + * This file contains the main function and supporting code for the Funk + * language interpreter, handling command-line arguments, file processing, + * and from lexing to evaluation. + */ + #include "logging/LogMacros.h" #include "parser/Parser.h" #include "utils/ArgParser.h" @@ -5,7 +13,10 @@ using namespace funk; -// Command line options +/** + * @brief Available command line options with descriptions + * Maps option flags to their help text descriptions + */ HashMap<String, String> options{ {"--help", "Display this help message"}, {"--log <file>", "Set the log file"}, @@ -14,15 +25,23 @@ HashMap<String, String> options{ {"--tokens", "Log the lexical tokens"}, }; -// Configuration for command line options +/** + * @brief Runtime configuration based on command line options + * Stores boolean flags for various runtime behaviors + */ struct Config { - bool debug{false}; - bool ast{false}; - bool tokens{false}; + bool debug{false}; ///< Enable debug level logging + bool ast{false}; ///< Print AST representation + bool tokens{false}; ///< Print lexical tokens }; -// Process command line arguments and set up logging +/** + * @brief Process command line arguments and configure the interpreter + * @param parser The argument parser containing command line options + * @param config The configuration to populate + * @return bool True if setup was successful, false otherwise + */ bool setup(ArgParser& parser, Config& config) { // Print help message @@ -64,7 +83,12 @@ bool setup(ArgParser& parser, Config& config) return true; } -// Process a single file +/** + * @brief Process a single Funk source file + * Handles the complete execution pipeline: lexing, parsing, and evaluation + * @param file Path to the source file + * @param config Runtime configuration options + */ void process_file(const String& file, const Config& config) { LOG_INFO("Processing file: " + file); @@ -101,6 +125,13 @@ void process_file(const String& file, const Config& config) } } +/** + * @brief Main entry point for the Funk interpreter + * Parses command line arguments and processes input files + * @param argc Number of command line arguments + * @param argv Array of command line argument strings + * @return int Exit code (0 for success, non-zero for errors) + */ int main(int argc, char* argv[]) { ArgParser parser(argc, argv);