added userdata void * for parser tag function callback

This commit is contained in:
herbglitch 2024-11-20 13:50:52 -07:00
parent 606f8e4bad
commit fcc07493d3
4 changed files with 25 additions and 21 deletions

View file

@ -28,7 +28,7 @@ typedef void (* ARC_ParserData_DestroyFn)(void *data);
/**
* @brief TODO: write this
*/
typedef void (* ARC_ParserLanguageTag_AddDataFn)(void **data, uint32_t tagId, ARC_LexerToken *token);
typedef void (* ARC_ParserLanguageTag_AddDataFn)(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData);
/**
* @brief a langue tag type for the parser //TODO: explain this better
@ -40,6 +40,7 @@ typedef struct ARC_ParserLanguageTag {
uint32_t tokensOrTagsSize;
ARC_ParserLanguageTag_AddDataFn *addDataFn;
void *addUserData;
} ARC_ParserLanguageTag;
/**

View file

@ -205,7 +205,7 @@ ARC_Bool ARC_Parser_ParseTag(ARC_Parser *parser, uint32_t *lexerIndex, uint32_t
//iterate through the tokens with the add callback
for(uint32_t index = 0; index < ARC_Vector_GetSize(foundTokens); index++){
ARC_LexerToken *token = (ARC_LexerToken *)ARC_Vector_Get(foundTokens, index);
(*(tag->addDataFn))(&(parser->data), tagId, token);
(*(tag->addDataFn))(&(parser->data), tagId, token, tag->addUserData);
}
}

View file

@ -76,19 +76,19 @@ void ARC_Parser_CreateAsParserLang(ARC_Parser **parser){
uint32_t *alphaChar[] = { (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_LOWER_CHAR }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR }};
ARC_ParserLanguageTag parserLangTags[13] = {
{ ARC_PARSERLANG_LINE , line , 4, NULL },
{ ARC_PARSERLANG_BODY , body , 1, NULL },
{ ARC_PARSERLANG_ARGUMENTS , arguments , 2, NULL },
{ ARC_PARSERLANG_ARGUMENT , argument , 2, NULL },
{ ARC_PARSERLANG_TAG_OR_CONSTANT, tagOrConstant, 2, NULL },
{ ARC_PARSERLANG_CONSTANT , constant , 1, NULL },
{ ARC_PARSERLANG_CONSTANT_BODY , constantBody , 2, NULL },
{ ARC_PARSERLANG_CONSTANT_CHAR , constantChar , 2, NULL },
{ ARC_PARSERLANG_TAG , tag , 1, NULL },
{ ARC_PARSERLANG_VARIABLE , variable , 2, NULL },
{ ARC_PARSERLANG_VARIABLE_BODY , variableBody , 2, NULL },
{ ARC_PARSERLANG_VARIABLE_CHAR , variableChar , 3, NULL },
{ ARC_PARSERLANG_ALPHA_CHAR , alphaChar , 2, NULL }
{ ARC_PARSERLANG_LINE , line , 4, NULL, NULL },
{ ARC_PARSERLANG_BODY , body , 1, NULL, NULL },
{ ARC_PARSERLANG_ARGUMENTS , arguments , 2, NULL, NULL },
{ ARC_PARSERLANG_ARGUMENT , argument , 2, NULL, NULL },
{ ARC_PARSERLANG_TAG_OR_CONSTANT, tagOrConstant, 2, NULL, NULL },
{ ARC_PARSERLANG_CONSTANT , constant , 1, NULL, NULL },
{ ARC_PARSERLANG_CONSTANT_BODY , constantBody , 2, NULL, NULL },
{ ARC_PARSERLANG_CONSTANT_CHAR , constantChar , 2, NULL, NULL },
{ ARC_PARSERLANG_TAG , tag , 1, NULL, NULL },
{ ARC_PARSERLANG_VARIABLE , variable , 2, NULL, NULL },
{ ARC_PARSERLANG_VARIABLE_BODY , variableBody , 2, NULL, NULL },
{ ARC_PARSERLANG_VARIABLE_CHAR , variableChar , 3, NULL, NULL },
{ ARC_PARSERLANG_ALPHA_CHAR , alphaChar , 2, NULL, NULL }
};
ARC_Array parserLanguageArray = {

View file

@ -21,7 +21,7 @@ void TEST_ParserLanguageTag_DestroyStringFn(void *data){
}
//for this very basic example, the tagId does not matter
void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_LexerToken *token){
void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){
if(*data == NULL){
return;
}
@ -34,7 +34,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 TEST_ParserLanguageTag_AddCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){
if(*data == NULL){
return;
}
@ -58,19 +58,22 @@ ARC_ParserLanguageTag testTags[3] = {
VARIABLE, //tagId
variableTokensOrTags, //tokensOrTags
1, //tokenOrTagsSize
&addFirstCharFn //addDataFn
&addFirstCharFn, //addDataFn
NULL //addUserData
},
{
VARIABLE_NAME, //tagId
variableNameTags, //tokensOrTags
2, //tokenOrTagsSize
NULL, //addDataFn
NULL //addUserData
},
{
CHAR_OR_NUM, //tagId
charOrNumTokens, //tokensOrTags
2, //tokenOrTagsSize
&addCharFn //addDataFn
&addCharFn, //addDataFn
NULL //addUserData
}
};
@ -111,10 +114,10 @@ ARC_TEST(Parser_Basic_Parse){
/* ~ 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);