From 4b8b1a98c09884ae73d25492471492b7299235c7 Mon Sep 17 00:00:00 2001 From: herbglitch Date: Mon, 31 Mar 2025 18:28:45 -0600 Subject: [PATCH] working on parser documentation and tests, breaking rn --- doc/pages/standard/parser.md | 6 ++ tests/std/parser.c | 177 ++++++++++++++++++++++++----------- 2 files changed, 127 insertions(+), 56 deletions(-) diff --git a/doc/pages/standard/parser.md b/doc/pages/standard/parser.md index 9e52d44..48eb436 100644 --- a/doc/pages/standard/parser.md +++ b/doc/pages/standard/parser.md @@ -1 +1,7 @@ \page standard-parser ARC_Parser + +# Basic Overview + +The ARC_Parser type + +# Basic Example diff --git a/tests/std/parser.c b/tests/std/parser.c index 54ef244..bf32192 100644 --- a/tests/std/parser.c +++ b/tests/std/parser.c @@ -9,63 +9,128 @@ #include //TODO: rewrite these tests. ARC_Config does use both the parser and lexer so for now (very temporary) its tests function for these ones +const char *languageCString = + " -> ALPHA_UPPER_CHAR | ALPHA_LOWER_CHAR | UNDERSCORE \n" + " -> | LAMBDA\n" + " -> ALPHA_UPPER_CHAR | ALPHA_LOWER_CHAR | UNDERSCORE | NUMBER\n"; + +#define ARC_TEST_TAG_UNDERSCORE 0 +#define ARC_TEST_TAG_NUMBER 1 +#define ARC_TEST_TAG_ALPHA_UPPER_CHAR 2 +#define ARC_TEST_TAG_ALPHA_LOWER_CHAR 3 +#define ARC_TEST_TAG_VARIABLE 4 +#define ARC_TEST_TAG_VARIABLE_NAME 5 +#define ARC_TEST_TAG_VARIABLE_CHAR 6 + +void ARC_TEST_InitLexerRulesFn(ARC_Lexer *lexer){ + ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharRule(ARC_TEST_TAG_UNDERSCORE, '_' )); + + ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_NUMBER , '0', '9')); + ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_ALPHA_LOWER_CHAR, 'a', 'z')); + ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_ALPHA_UPPER_CHAR, 'A', 'Z')); +} + +uint32_t ARC_TEST_GetStringIdFn(ARC_String *string){ + if(ARC_String_EqualsCStringWithStrlen(string, "LAMBDA")){ + return ARC_PARSER_TAG_LAMBDA; + } + + if(ARC_String_EqualsCStringWithStrlen(string, "UNDERSCORE")){ + return ARC_TEST_TAG_UNDERSCORE; + } + + if(ARC_String_EqualsCStringWithStrlen(string, "NUMBER")){ + return ARC_TEST_TAG_NUMBER; + } + if(ARC_String_EqualsCStringWithStrlen(string, "ALPHA_UPPER_CHAR")){ + return ARC_TEST_TAG_ALPHA_UPPER_CHAR; + } + if(ARC_String_EqualsCStringWithStrlen(string, "ALPHA_LOWER_CHAR")){ + return ARC_TEST_TAG_ALPHA_LOWER_CHAR; + } + + if(ARC_String_EqualsCStringWithStrlen(string, "")){ + return ARC_TEST_TAG_VARIABLE; + } + if(ARC_String_EqualsCStringWithStrlen(string, "")){ + return ARC_TEST_TAG_VARIABLE_NAME; + } + if(ARC_String_EqualsCStringWithStrlen(string, "")){ + return ARC_TEST_TAG_VARIABLE_CHAR; + } + + return ~(uint32_t)0; +} + +void ARC_TESTData_CreateFn(void **data, ARC_ParserTagToken *parsedData, void *userData){ +} + +void ARC_TESTData_DestroyFn(void *data, ARC_Bool clear, void *userData){ +} + +ARC_TEST(Parser_Init){ + ARC_String *languageString; + ARC_String_CreateWithStrlen(&languageString, (char *)languageCString); + + ARC_Parser *parser; + ARC_ParserData_CreateFn createCharFn = ARC_TESTData_CreateFn; + ARC_ParserData_DestroyFn destroyCharFn = ARC_TESTData_DestroyFn; + ARC_Parser_CreateFromString(&parser, languageString, ARC_TEST_InitLexerRulesFn, ARC_TEST_GetStringIdFn, &createCharFn, &destroyCharFn, NULL); + ARC_String_Destroy(languageString); + + ARC_Parser_Destroy(parser); + + ARC_CHECK(arc_errno == 0); +} + +ARC_TEST(Parser_Basic_Parse){ + ARC_String *languageString; + ARC_String_CreateWithStrlen(&languageString, (char *)languageCString); + + ARC_Parser *parser; + ARC_ParserData_CreateFn createCharFn = ARC_TESTData_CreateFn; + ARC_ParserData_DestroyFn destroyCharFn = ARC_TESTData_DestroyFn; + ARC_Parser_CreateFromString(&parser, languageString, ARC_TEST_InitLexerRulesFn, ARC_TEST_GetStringIdFn, &createCharFn, &destroyCharFn, NULL); + ARC_String_Destroy(languageString); + + /* ~ first test ~ */ + ARC_String *tempString; + ARC_String_CreateWithStrlen(&tempString, "myvar1"); + + //this destroys string, so no need for cleanup + ARC_Parser_Parse(parser, &tempString); + + ARC_CHECK(arc_errno == 0); + + /* ~ second test ~ */ + ARC_String_CreateWithStrlen(&tempString, "z1xwvq"); + + //this destroys string, so no need for cleanup + ARC_Parser_Parse(parser, &tempString); + + ARC_CHECK(arc_errno == 0); + + /* ~ third test ~ */ + ARC_String_CreateWithStrlen(&tempString, "z1234"); + + //this destroys string, so no need for cleanup + ARC_Parser_Parse(parser, &tempString); + + ARC_CHECK(arc_errno == 0); + + /* ~ fourth test ~ */ + ARC_String_CreateWithStrlen(&tempString, "aaaaa"); + + + //this destroys string, so no need for cleanup + ARC_Parser_Parse(parser, &tempString); + + ARC_CHECK(arc_errno == 0); + + /* ~ cleanup ~ */ + ARC_Parser_Destroy(parser); +} -//ARC_TEST(Parser_Init){ -// ARC_Parser *parser; -// ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn, NULL, NULL, NULL); -// -// ARC_Parser_Destroy(parser); -// -// ARC_CHECK(arc_errno == 0); -//} -// -//ARC_TEST(Parser_Basic_Parse){ -// ARC_Parser *parser; -// ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn, NULL, NULL, NULL); -// -// ARC_String *tempString; -// -// -// /* ~ first test ~ */ -// ARC_String_CreateWithStrlen(&tempString, "myvar1"); -// -// //this destroys string, so no need for cleanup -// ARC_Parser_Parse(parser, &tempString); -// -// ARC_CHECK(arc_errno == 0); -// -// -// /* ~ second test ~ */ -// ARC_String_CreateWithStrlen(&tempString, "z1xwvq"); -// -// //this destroys string, so no need for cleanup -// ARC_Parser_Parse(parser, &tempString); -// -// ARC_CHECK(arc_errno == 0); -// -// -// /* ~ third test ~ */ -// ARC_String_CreateWithStrlen(&tempString, "z1234"); -// -// //this destroys string, so no need for cleanup -// ARC_Parser_Parse(parser, &tempString); -// -// ARC_CHECK(arc_errno == 0); -// -// -// /* ~ fourth test ~ */ -// ARC_String_CreateWithStrlen(&tempString, "aaaaa"); -// -// //this destroys string, so no need for cleanup -// ARC_Parser_Parse(parser, &tempString); -// -// ARC_CHECK(arc_errno == 0); -// -// -// /* ~ cleanup ~ */ -// ARC_Parser_Destroy(parser); -//} -// //ARC_TEST(Parser_Basic_ParseError){ // ARC_Parser *parser; // ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn, NULL, NULL, NULL);