still working on parser, plan to rework to parsing first, then calling struct creation callback after with vector of tokens and tags

This commit is contained in:
herbglitch 2024-11-23 19:27:30 -07:00
parent fcc07493d3
commit d69844dab1
9 changed files with 251 additions and 27 deletions

View file

@ -2,6 +2,7 @@
#include "arc/std/errno.h"
#include "arc/std/parser.h"
#include "arc/std/lexer.h"
#include "arc/std/vector.h"
#include "arc/std/parser/parserlang.h"
#include <stddef.h>
@ -12,16 +13,16 @@
#define VARIABLE_NAME 24
#define VARIABLE 25
void TEST_ParserLanguageTag_CreateStringFn(void **data){
void TEST_ParserData_CreateStringFn(void **data){
ARC_String_Create((ARC_String **)data, NULL, 0);
}
void TEST_ParserLanguageTag_DestroyStringFn(void *data){
void TEST_ParserData_DestroyStringFn(void *data){
ARC_String_Destroy((ARC_String *)data);
}
//for this very basic example, the tagId does not matter
void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){
void TEST_ParserTag_AddFirstCharFn(void **data, uint32_t tagId, uint32_t tagIndex, ARC_LexerToken *token, void *userData){
if(*data == NULL){
return;
}
@ -34,7 +35,7 @@ void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_Lexe
}
//for this very basic example, the tagId does not matter
void TEST_ParserLanguageTag_AddCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){
void TEST_ParserTag_AddCharFn(void **data, uint32_t tagId, uint32_t tagIndex, ARC_LexerToken *token, void *userData){
if(*data == NULL){
return;
}
@ -47,13 +48,13 @@ uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME
uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } };
//TODO: note how language function callbacks work, and how they use the parentData if createDataFn is NULL
ARC_ParserData_CreateFn createStringFn = TEST_ParserLanguageTag_CreateStringFn;
ARC_ParserData_DestroyFn destroyStringFn = TEST_ParserLanguageTag_DestroyStringFn;
ARC_ParserData_CreateFn createStringFn = TEST_ParserData_CreateStringFn;
ARC_ParserData_DestroyFn destroyStringFn = TEST_ParserData_DestroyStringFn;
ARC_ParserLanguageTag_AddDataFn addCharFn = TEST_ParserLanguageTag_AddCharFn;
ARC_ParserLanguageTag_AddDataFn addFirstCharFn = TEST_ParserLanguageTag_AddFirstCharFn;
ARC_ParserTag_AddDataFn addCharFn = TEST_ParserTag_AddCharFn;
ARC_ParserTag_AddDataFn addFirstCharFn = TEST_ParserTag_AddFirstCharFn;
ARC_ParserLanguageTag testTags[3] = {
ARC_ParserTag testTags[3] = {
{
VARIABLE, //tagId
variableTokensOrTags, //tokensOrTags
@ -213,7 +214,6 @@ ARC_TEST(Parser_Basic_GetParsedValue){
ARC_Parser_Destroy(parser);
}
ARC_TEST(Parser_ParserLang_BasicTest){
ARC_Parser *parser;
ARC_Parser_CreateAsParserLang(&parser);
@ -229,3 +229,26 @@ ARC_TEST(Parser_ParserLang_BasicTest){
ARC_CHECK(arc_errno == 0);
}
ARC_TEST(Parser_ParserLang_BasicVector){
ARC_Vector *testLanguage;
ARC_Vector_Create(&testLanguage, NULL, NULL);
ARC_Vector_Add(testLanguage, testTags + 0);
ARC_Vector_Add(testLanguage, testTags + 1);
ARC_Vector_Add(testLanguage, testTags + 2);
ARC_Parser *parser;
ARC_Parser_CreateFromVector(&parser, testLanguage, TEST_Parser_InitLexerRulesFn, NULL, NULL);
ARC_String *tempString;
ARC_String_CreateWithStrlen(&tempString, "variablename");
//this destroys string, so no need for cleanup
ARC_Parser_Parse(parser, &tempString);
//cleanup
ARC_Parser_Destroy(parser);
ARC_Vector_Destroy(testLanguage);
ARC_CHECK(arc_errno == 0);
}