#include "arc/std/parser.h" #include "arc/std/errno.h" #include "arc/std/lexer.h" #include #include #include struct ARC_Parser { ARC_Array language; ARC_Lexer *lexer; }; void ARC_Parser_Create(ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn){ *parser = (ARC_Parser *)malloc(sizeof(ARC_Parser)); //set the language size to 0 and data to NULL in case the language is NULL (*parser)->language.size = 0; (*parser)->language.data = NULL; //if the language exists, copy the language if(language != NULL){ (*parser)->language.size = language->size; (*parser)->language.data = malloc(sizeof(ARC_ParserLanguageTag) * language->size); memcpy((*parser)->language.data, language->data, language->size); } //create the lexer ARC_Lexer_Create(&((*parser)->lexer)); //register instructions to the lexer initLexerRulesFn(((*parser)->lexer)); } void ARC_Parser_CreateFromString(ARC_Parser **parser, ARC_String *languageString, ARC_Parser_InitLexerRulesFn initLexerRulesFn){ } void ARC_Parser_Destroy(ARC_Parser *parser){ free(parser->language.data); ARC_Lexer_Destroy(parser->lexer); free(parser); } //private recusive function to parse a tag void ARC_Parser_ParseTag(ARC_Parser *parser, ARC_String *subdata, uint32_t tagId){ //get the current tag ARC_ParserLanguageTag *tag = NULL; for(uint32_t index = 0; index < parser->language.size; index++){ ARC_ParserLanguageTag *foundTag = ((ARC_ParserLanguageTag *)parser->language.data) + index; if(foundTag->tagId == tagId){ tag = foundTag; break; } } //if the tag was not found can't do much, so throw an error if(tag == NULL){ arc_errno = ARC_ERRNO_NULL; ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Parser_ParseTag(parser, subdata, tagId), could not find tag with id: %u", tagId); return; } } void ARC_Parser_Parse(ARC_Parser *parser, ARC_String *data){ } void ARC_Parser_ParseFile(ARC_Parser *parser, ARC_String *path){ }