segfault when testing parser

This commit is contained in:
herbglitch 2024-10-28 21:00:48 -06:00
parent d8d1a1a107
commit 050f7a8452
2 changed files with 84 additions and 0 deletions

View file

@ -92,6 +92,7 @@ void ARC_Parser_ParseTag(ARC_Parser *parser, uint32_t *lexerIndex, uint32_t tagI
//if the rule is found we don't need to check anymore so we can return out //if the rule is found we don't need to check anymore so we can return out
if(foundRule == ARC_True){ if(foundRule == ARC_True){
*lexerIndex = lexerCheckIndex; *lexerIndex = lexerCheckIndex;
//TODO: set tag into datastructure
return; return;
} }
} }
@ -106,6 +107,7 @@ void ARC_Parser_Parse(ARC_Parser *parser, ARC_String **data){
ARC_Lexer_LexString(parser->lexer, data); ARC_Lexer_LexString(parser->lexer, data);
if(arc_errno){ if(arc_errno){
ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), could not lex the given data"); ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), could not lex the given data");
return;
} }
uint32_t lexerIndex = 0; uint32_t lexerIndex = 0;
@ -115,6 +117,7 @@ void ARC_Parser_Parse(ARC_Parser *parser, ARC_String **data){
ARC_Parser_ParseTag(parser, &lexerIndex, startTag.tagId); ARC_Parser_ParseTag(parser, &lexerIndex, startTag.tagId);
if(arc_errno){ if(arc_errno){
ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), could not parse the given data"); ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), could not parse the given data");
return;
} }
} }

View file

@ -1,4 +1,5 @@
#include "../test.h" #include "../test.h"
#include "arc/std/errno.h"
#include "arc/std/parser.h" #include "arc/std/parser.h"
#define LAMBDA 0 #define LAMBDA 0
@ -47,3 +48,83 @@ ARC_TEST(Parser_Init){
ARC_CHECK(1 == 1); ARC_CHECK(1 == 1);
} }
ARC_TEST(Parser_Basic_Parse){
ARC_Parser *parser;
uint32_t *charOrNumTokens[] = { (uint32_t[]){ 1, CHAR }, (uint32_t[]){ 1, NUM } };
uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME }, (uint32_t[]){ 1, LAMBDA } };
uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } };
ARC_ParserLanguageTag testTags[3] = {
{
CHAR_OR_NUM, //tagId
charOrNumTokens, //tokensOrTags
2 //tokenOrTagsSize
},
{
VARIABLE_NAME, //tagId
variableNameTags, //tokensOrTags
2 //tokenOrTagsSize
},
{
VARIABLE, //tagId
variableTokensOrTags, //tokensOrTags
1 //tokenOrTagsSize
}
};
ARC_Array languageArray = {
3, //size
testTags //data
};
ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn);
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);
}
ARC_TEST(Parser_Basic_ParseError){
ARC_Parser *parser;
uint32_t *charOrNumTokens[] = { (uint32_t[]){ 1, CHAR }, (uint32_t[]){ 1, NUM } };
uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME }, (uint32_t[]){ 1, LAMBDA } };
uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } };
ARC_ParserLanguageTag testTags[3] = {
{
CHAR_OR_NUM, //tagId
charOrNumTokens, //tokensOrTags
2 //tokenOrTagsSize
},
{
VARIABLE_NAME, //tagId
variableNameTags, //tokensOrTags
2 //tokenOrTagsSize
},
{
VARIABLE, //tagId
variableTokensOrTags, //tokensOrTags
1 //tokenOrTagsSize
}
};
ARC_Array languageArray = {
3, //size
testTags //data
};
ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn);
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 == ARC_ERRNO_DATA);
}