2024-10-16 05:14:53 -06:00
|
|
|
#include "arc/std/parser.h"
|
2024-10-16 23:46:16 -06:00
|
|
|
#include "arc/std/errno.h"
|
2024-10-16 05:14:53 -06:00
|
|
|
#include "arc/std/lexer.h"
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
struct ARC_Parser {
|
|
|
|
|
ARC_Array language;
|
|
|
|
|
|
|
|
|
|
ARC_Lexer *lexer;
|
|
|
|
|
};
|
|
|
|
|
|
2024-10-16 18:00:52 -06:00
|
|
|
void ARC_Parser_Create(ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn){
|
2024-10-16 05:14:53 -06:00
|
|
|
*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));
|
|
|
|
|
|
2024-10-16 18:00:52 -06:00
|
|
|
//register instructions to the lexer
|
|
|
|
|
initLexerRulesFn(((*parser)->lexer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ARC_Parser_CreateFromString(ARC_Parser **parser, ARC_String *languageString, ARC_Parser_InitLexerRulesFn initLexerRulesFn){
|
2024-10-16 05:14:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ARC_Parser_Destroy(ARC_Parser *parser){
|
|
|
|
|
free(parser->language.data);
|
|
|
|
|
|
|
|
|
|
ARC_Lexer_Destroy(parser->lexer);
|
|
|
|
|
|
|
|
|
|
free(parser);
|
|
|
|
|
}
|
2024-10-16 18:00:52 -06:00
|
|
|
|
2024-10-16 23:46:16 -06:00
|
|
|
//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;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-16 18:00:52 -06:00
|
|
|
|
2024-10-16 23:46:16 -06:00
|
|
|
void ARC_Parser_Parse(ARC_Parser *parser, ARC_String *data){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ARC_Parser_ParseFile(ARC_Parser *parser, ARC_String *path){
|
|
|
|
|
|
|
|
|
|
}
|