From 5ba801a756786a71a091a32ca55020a046e178c6 Mon Sep 17 00:00:00 2001 From: erick-alcachofa Date: Sun, 5 Oct 2025 22:55:49 -0600 Subject: [PATCH] feat: Add file parsing entry point and refine grammar rules Signed-off-by: erick-alcachofa - Updated `main.cpp` to read source files and invoke the parser using `MatcherRule`, providing clear error output or success indication. - Replaced `peek` with `peekExpect` in `Parser` to ensure expected token types. - Replaced parentheses with curly braces for struct and enum definitions as specified on grammar. - Fixed `StructMembers` and `EnumMembers` to allow zero or more entries as specified on grammar. - Replaced `MatcherNoneOrOnce` with `MatcherNoneOrMore` in expression rules to support chained binary expressions as specified on grammar. - Reorganized `PrimaryTypeExpression` to include all valid expression types, and reordered rules for better match accuracy. - Fixed `TypesListR` to correctly refer to `Type` instead of `TypesListR` in its recursive rule. These changes fixes language grammar coverage, fix structural parsing bugs, and enable full file parsing from the frontend. --- frontend/src/main.cpp | 44 +++++++++++++++++++++++-- lib/include/artichoke/Parser/Parser.hpp | 40 +++++++++++----------- 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/frontend/src/main.cpp b/frontend/src/main.cpp index 3e67a25..434a578 100644 --- a/frontend/src/main.cpp +++ b/frontend/src/main.cpp @@ -1,5 +1,45 @@ #include +#include -int main(int, char **) { - std::println("[LOG] Hello world"); +#include + +int main(int argc, char **argv) { + using namespace arti::lang; + + if (argc < 2) { + std::println("Usage:\n {} ", argv[0]); + return -1; + } + + std::ifstream file; + file.open(argv[1]); + + if (!file.is_open()) { + std::println("Failed to open file {}", argv[1]); + return -1; + } + + std::string buffer{ + std::istreambuf_iterator(file), + std::istreambuf_iterator() + }; + + Tokenizer tokenizer{buffer}; + + auto result = MatcherRule::parse(&tokenizer, 0); + + if (!result) { + auto err = std::move(result).error(); + std::println( + "Error at line {}, column {}. {}", + err.line, + err.column, + err.message + ); + } + else { + std::println("Valid source"); + } + + return 0; } diff --git a/lib/include/artichoke/Parser/Parser.hpp b/lib/include/artichoke/Parser/Parser.hpp index 13e1d0c..4e17bc6 100644 --- a/lib/include/artichoke/Parser/Parser.hpp +++ b/lib/include/artichoke/Parser/Parser.hpp @@ -68,7 +68,7 @@ namespace arti::lang { }; } - auto token = tokenizer->peek(offset); + auto token = tokenizer->peekExpect(offset, tokenType); if (!token) { return Unexpected<>{ std::move(token).error() }; @@ -545,9 +545,9 @@ namespace arti::lang { MatcherToken, MatcherToken, MatcherRule, - MatcherToken, + MatcherToken, MatcherRule, - MatcherToken + MatcherToken >; }; @@ -555,7 +555,7 @@ namespace arti::lang { static constexpr std::string_view Name = "StructMembers"; using Rule = MatcherSequence< MatcherRule, - MatcherOnceOrMore< + MatcherNoneOrMore< MatcherSequence< MatcherToken, MatcherRule @@ -580,9 +580,9 @@ namespace arti::lang { MatcherToken, MatcherToken, MatcherRule, - MatcherToken, + MatcherToken, MatcherRule, - MatcherToken + MatcherToken >; }; @@ -590,10 +590,10 @@ namespace arti::lang { static constexpr std::string_view Name = "EnumMembers"; using Rule = MatcherSequence< MatcherRule, - MatcherOnceOrMore< + MatcherNoneOrMore< MatcherSequence< MatcherToken, - MatcherRule + MatcherRule > > >; @@ -1012,7 +1012,7 @@ namespace arti::lang { static constexpr std::string_view Name = "BoolOrExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherAnyOf< MatcherToken, @@ -1028,7 +1028,7 @@ namespace arti::lang { static constexpr std::string_view Name = "BoolAndExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherAnyOf< MatcherToken, @@ -1057,7 +1057,7 @@ namespace arti::lang { static constexpr std::string_view Name = "BitwiseExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherRule, MatcherRule @@ -1070,7 +1070,7 @@ namespace arti::lang { static constexpr std::string_view Name = "BitwiseShiftExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherRule, MatcherRule @@ -1083,7 +1083,7 @@ namespace arti::lang { static constexpr std::string_view Name = "AdditionExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherRule, MatcherRule @@ -1096,7 +1096,7 @@ namespace arti::lang { static constexpr std::string_view Name = "MultiplyExpression"; using Rule = MatcherSequence< MatcherRule, - MatcherNoneOrOnce< + MatcherNoneOrMore< MatcherSequence< MatcherRule, MatcherRule @@ -1131,6 +1131,11 @@ namespace arti::lang { struct PrimaryTypeExpression { static constexpr std::string_view Name = "PrimaryTypeExpression"; using Rule = MatcherAnyOf< + MatcherRule, + MatcherRule, + MatcherRule, + MatcherRule, + MatcherRule, MatcherToken, MatcherToken, MatcherToken, @@ -1138,10 +1143,7 @@ namespace arti::lang { MatcherToken, MatcherToken, MatcherToken, - MatcherRule, - MatcherRule, - MatcherRule, - MatcherRule + MatcherToken >; }; @@ -1495,7 +1497,7 @@ namespace arti::lang { MatcherNoneOrMore< MatcherSequence< MatcherToken, - MatcherRule + MatcherRule > > >;