Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
parser.c File Reference
#include "arc/std/parser/parserlang.h"
#include "arc/std/parser.h"
#include "arc/std/bool.h"
#include "arc/std/errno.h"
#include "arc/std/io.h"
#include "arc/std/lexer.h"
#include "arc/std/vector.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Data Structures

struct  ARC_Parser
 

Functions

void ARC_Parser_Create (ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
 creates an ARC_Parser type
 
void ARC_Parser_CreateFromVector (ARC_Parser **parser, ARC_Vector *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
 creates an ARC_Parser type from an arc vector
 
void ARC_Parser_CreateFromString (ARC_Parser **parser, ARC_String *languageString, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_Parser_GetStringIdFn getStringIdFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
 creates an ARC_Parser type from a string
 
void ARC_Parser_Destroy (ARC_Parser *parser)
 destroys an ARC_Parser type
 
void ARC_ParserTagToken_Create (ARC_ParserTagToken **tagToken, uint32_t id)
 
void ARC_ParserTagToken_Destroy (ARC_ParserTagToken *tagToken)
 
void ARC_ParserTagToken_VectorDestroyDataFn (void *data)
 
ARC_Bool ARC_Parser_ParseTag (ARC_Parser *parser, ARC_ParserTagToken *tagToken, uint32_t *lexerIndex)
 
void ARC_Parser_Parse (ARC_Parser *parser, ARC_String **data)
 
void ARC_Parser_ParseFile (ARC_Parser *parser, ARC_String *path)
 
void ARC_Parser_ClearData (ARC_Parser *parser)
 
void * ARC_Parser_GetData (ARC_Parser *parser)
 

Function Documentation

◆ ARC_Parser_ClearData()

void ARC_Parser_ClearData ( ARC_Parser * parser)
Parameters
[in]parser

Definition at line 358 of file parser.c.

358 {
359 //check if that data exists and the destructor exists to make sure they can be run, set to true to indicate clear
360 if(parser->data != NULL && parser->destroyDataFn != NULL){
361 (*(parser->destroyDataFn))(parser->data, ARC_True, parser->userData);
362 }
363
364 //TODO: might want to error here
365 parser->data = NULL;
366}
#define ARC_True
Definition bool.h:11
void * data
Definition parser.c:17
void * userData
Definition parser.c:18
ARC_ParserData_DestroyFn * destroyDataFn
Definition parser.c:20

References ARC_True, ARC_Parser::data, ARC_Parser::destroyDataFn, and ARC_Parser::userData.

◆ ARC_Parser_Create()

void ARC_Parser_Create ( ARC_Parser ** parser,
ARC_Array * language,
ARC_Parser_InitLexerRulesFn initLexerRulesFn,
ARC_ParserData_CreateFn * createDataFn,
ARC_ParserData_DestroyFn * destroyDataFn,
void * userData )

creates an ARC_Parser type

@TODO: fix this documentation to reflect changes

@TODO: probs want to move the note to another file

Note
array of tokens for langauge? like ARC_ParserTag tag = { VARIABLE_NAME, //tagId { { 2, CHAR_OR_NUM, VARIABLE_NAME }, { 1, LAMBDA }, }, //components 2 //componentsSize };
Parameters
[out]parserARC_Parser to create
[in]languagean arry of ARC_ParserLanguageTags defining a langauge
[in]initLexerRulesFna callback used to initalize the token rules the lexer within the parser will use

Definition at line 24 of file parser.c.

24 {
25 *parser = (ARC_Parser *)malloc(sizeof(ARC_Parser));
26
27 //set the language size to 0 and data to NULL in case the language is NULL
28 (*parser)->language.size = 0;
29 (*parser)->language.data = NULL;
30
31 //if the language exists, copy the language
32 if(language != NULL){
33 (*parser)->language.size = language->size;
34 (*parser)->language.data = malloc(sizeof(ARC_ParserTag) * language->size);
35
36 for(uint32_t index = 0; index < language->size; index++){
37 ARC_ParserTag *languageTag = ((ARC_ParserTag *)language->data) + index;
38 ARC_ParserTag *currentTag = ((ARC_ParserTag *)(*parser)->language.data) + index;
39
40 //copy the language tag into the current tag
41 currentTag->tagId = languageTag->tagId;
42 currentTag->tokensOrTagsSize = languageTag->tokensOrTagsSize;
43
44 //create place to store tokens or tags
45 currentTag->tokensOrTags = (uint32_t **)malloc(sizeof(uint32_t *) * languageTag->tokensOrTagsSize);
46
47 //copy each or section into the tokensOrTags
48 for(uint32_t orIndex = 0; orIndex < languageTag->tokensOrTagsSize; orIndex++){
49 currentTag->tokensOrTags[orIndex] = (uint32_t *)malloc(sizeof(uint32_t) * (languageTag->tokensOrTags[orIndex][0] + 1));
50
51 for(uint32_t tokenOrTagIndex = 0; tokenOrTagIndex < languageTag->tokensOrTags[orIndex][0] + 1; tokenOrTagIndex++){
52 currentTag->tokensOrTags[orIndex][tokenOrTagIndex] = languageTag->tokensOrTags[orIndex][tokenOrTagIndex];
53 }
54 }
55 }
56 }
57
58 //create the lexer
59 ARC_Lexer_Create(&((*parser)->lexer));
60
61 //register instructions to the lexer
62 initLexerRulesFn(((*parser)->lexer));
63
64 //set the data to null (the parse function is what creates it)
65 (*parser)->data = NULL;
66
67 //set the userData for the create callback function
68 (*parser)->userData = userData;
69
70 //init the create function callback with null, then copy the callback if it exists
71 (*parser)->createDataFn = NULL;
72 if(createDataFn != NULL){
73 (*parser)->createDataFn = (ARC_ParserData_CreateFn *)malloc(sizeof(ARC_ParserData_CreateFn));
74 *((*parser)->createDataFn) = *createDataFn;
75 }
76
77 //init the destroy function callback with null, then copy the callback if it exists
78 (*parser)->destroyDataFn = NULL;
79 if(createDataFn != NULL){
80 (*parser)->destroyDataFn = (ARC_ParserData_DestroyFn *)malloc(sizeof(ARC_ParserData_DestroyFn));
81 *((*parser)->destroyDataFn) = *destroyDataFn;
82 }
83}
void ARC_Lexer_Create(ARC_Lexer **lexer)
creates an ARC_Lexer type
Definition lexer.c:50
void(* ARC_ParserData_CreateFn)(void **data, ARC_ParserTagToken *parsedData, void *userData)
TODO: write this.
Definition parser.h:57
void(* ARC_ParserData_DestroyFn)(void *data, ARC_Bool clear, void *userData)
TODO: write this.
Definition parser.h:62
uint32_t size
Definition array.h:14
void * data
Definition array.h:15
a langue tag type for the parser //TODO: explain this better
Definition parser.h:21
uint32_t tagId
Definition parser.h:22
uint32_t tokensOrTagsSize
Definition parser.h:25
uint32_t ** tokensOrTags
Definition parser.h:24
ARC_Array language
Definition parser.c:13

References ARC_Lexer_Create(), ARC_Array::data, ARC_Parser::language, ARC_Array::size, ARC_ParserTag::tagId, ARC_ParserTag::tokensOrTags, and ARC_ParserTag::tokensOrTagsSize.

Referenced by ARC_Parser_CreateFromVector(), and ARC_ParserLang_CreateAsParser().

◆ ARC_Parser_CreateFromString()

void ARC_Parser_CreateFromString ( ARC_Parser ** parser,
ARC_String * languageString,
ARC_Parser_InitLexerRulesFn initLexerRulesFn,
ARC_Parser_GetStringIdFn getStringIdFn,
ARC_ParserData_CreateFn * createDataFn,
ARC_ParserData_DestroyFn * destroyDataFn,
void * userData )

creates an ARC_Parser type from a string

@TODO: probs want to move the note to another file

Note
the syntax looks like: <variable> -> CHAR <variableName> EOF <variableName> -> <charOrNum> <variableName> | LAMBDA <charOrNum> -> CHAR | NUM
Parameters
[out]parserARC_Parser to create
[in]languagean arry of ARC_ParserLanguageTags defining a langauge
[in]initLexerRulesFna callback used to initalize the token rules the lexer within the parser will use

Definition at line 105 of file parser.c.

105 {
106 //create the language from the string
107 ARC_Parser *parserlangParser;
108 ARC_ParserLang_CreateAsParser(&parserlangParser, getStringIdFn);
109 if(arc_errno){
110 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Parser_CreateFromString(parser, languageString, initLexerRulesFn, getStringIdFn, createDataFn, destroyDataFn, userData), failed to create language from: %s", languageString->data);
111 return;
112 }
113
114 //copy the string because parse will destroy the string that is passed in
115 ARC_String *parserLangString;
116 ARC_String_Copy(&parserLangString, languageString);
117 ARC_Parser_Parse(parserlangParser, &parserLangString);
118
119 //create the parser from the parsed language
120 ARC_Vector *language = (ARC_Vector *)ARC_Parser_GetData(parserlangParser);
121 ARC_Parser_CreateFromVector(parser, language, initLexerRulesFn, createDataFn, destroyDataFn, userData);
122
123 //cleanup
124 ARC_Parser_Destroy(parserlangParser);
125}
int32_t arc_errno
Definition errno.c:5
#define ARC_DEBUG_LOG_ERROR_WITH_VARIABLES(STR,...)
Definition errno.h:40
void ARC_Parser_Parse(ARC_Parser *parser, ARC_String **data)
Definition parser.c:297
void ARC_Parser_CreateFromVector(ARC_Parser **parser, ARC_Vector *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
creates an ARC_Parser type from an arc vector
Definition parser.c:85
void ARC_Parser_Destroy(ARC_Parser *parser)
destroys an ARC_Parser type
Definition parser.c:127
void * ARC_Parser_GetData(ARC_Parser *parser)
Definition parser.c:368
void ARC_ParserLang_CreateAsParser(ARC_Parser **parser, ARC_Parser_GetStringIdFn getStringIdFn)
creates a parser for the Parser Lang
Definition parserlang.c:324
void ARC_String_Copy(ARC_String **copy, ARC_String *original)
copy a ARC_String
Definition string.c:62
substring position within a string
Definition string.h:14
char * data
Definition string.h:15

References ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_Parser_CreateFromVector(), ARC_Parser_Destroy(), ARC_Parser_GetData(), ARC_Parser_Parse(), ARC_ParserLang_CreateAsParser(), ARC_String_Copy(), and ARC_String::data.

Referenced by ARC_ParserCSV_CreateAsParser().

◆ ARC_Parser_CreateFromVector()

void ARC_Parser_CreateFromVector ( ARC_Parser ** parser,
ARC_Vector * language,
ARC_Parser_InitLexerRulesFn initLexerRulesFn,
ARC_ParserData_CreateFn * createDataFn,
ARC_ParserData_DestroyFn * destroyDataFn,
void * userData )

creates an ARC_Parser type from an arc vector

Parameters
[out]parserARC_Parser to create
[in]languagean vector of ARC_ParserLanguageTags defining a langauge
[in]initLexerRulesFna callback used to initalize the token rules the lexer within the parser will use

Definition at line 85 of file parser.c.

85 {
86 //creates the variables to copy the vector into
87 const uint32_t languageSize = ARC_Vector_GetSize(language);
88 ARC_ParserTag languageArray[languageSize];
89
90 //copy the language from a vector into an array
91 for(uint32_t index = 0; index < languageSize; index++){
92 languageArray[index] = *(ARC_ParserTag *)ARC_Vector_Get(language, index);
93 }
94
95 //set the vector data as an ARC_Array
96 ARC_Array languageAsArray = {
97 languageSize,
98 languageArray
99 };
100
101 //create the parser
102 ARC_Parser_Create(parser, &languageAsArray, initLexerRulesFn, createDataFn, destroyDataFn, userData);
103}
void ARC_Parser_Create(ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
creates an ARC_Parser type
Definition parser.c:24
a type that holds an array of data and its size
Definition array.h:13
uint32_t ARC_Vector_GetSize(ARC_Vector *vector)
gets the current size of an ARC_Vector as an unsigned 32 bit integer
Definition vector.c:146
void * ARC_Vector_Get(ARC_Vector *vector, uint32_t index)
gets an item from an ARC_Vector at a position index
Definition vector.c:150

References ARC_Parser_Create(), ARC_Vector_Get(), and ARC_Vector_GetSize().

Referenced by ARC_Parser_CreateFromString().

◆ ARC_Parser_Destroy()

void ARC_Parser_Destroy ( ARC_Parser * parser)

destroys an ARC_Parser type

Parameters
[in]parserARC_Parser to free

Definition at line 127 of file parser.c.

127 {
128 //clear all the copied token or tags from memory
129 for(uint32_t index = 0; index < parser->language.size; index++){
130 ARC_ParserTag *currentTag = ((ARC_ParserTag *)parser->language.data) + index;
131
132 //free the orIndex vlues
133 for(uint32_t orIndex = 0; orIndex < currentTag->tokensOrTagsSize; orIndex++){
134 free(currentTag->tokensOrTags[orIndex]);
135 }
136
137 //free the tokens or tags
138 free(currentTag->tokensOrTags);
139 }
140
141 //free the creation function callback
142 if(parser->createDataFn != NULL){
143 free(parser->createDataFn);
144 }
145
146 //do the same thing as clear but this time pass in the userData as well to clean that up
147 if(parser->destroyDataFn != NULL){
148 //set to false to indicate full destroy instead of clear
149 (*(parser->destroyDataFn))(parser->data, ARC_False, parser->userData);
150 free(parser->destroyDataFn);
151 }
152
153 //clear the copied language from memory
154 free(parser->language.data);
155
156 ARC_Lexer_Destroy(parser->lexer);
157
158 free(parser);
159}
#define ARC_False
Definition bool.h:12
void ARC_Lexer_Destroy(ARC_Lexer *lexer)
destroys an ARC_Lexer type
Definition lexer.c:68
ARC_ParserData_CreateFn * createDataFn
Definition parser.c:19
ARC_Lexer * lexer
Definition parser.c:15

References ARC_False, ARC_Lexer_Destroy(), ARC_Parser::createDataFn, ARC_Array::data, ARC_Parser::data, ARC_Parser::destroyDataFn, ARC_Parser::language, ARC_Parser::lexer, ARC_Array::size, ARC_ParserTag::tokensOrTags, ARC_ParserTag::tokensOrTagsSize, and ARC_Parser::userData.

Referenced by ARC_Parser_CreateFromString().

◆ ARC_Parser_GetData()

void * ARC_Parser_GetData ( ARC_Parser * parser)
Parameters
[in]parser

Definition at line 368 of file parser.c.

368 {
369 return parser->data;
370}

References ARC_Parser::data.

Referenced by ARC_Parser_CreateFromString().

◆ ARC_Parser_Parse()

void ARC_Parser_Parse ( ARC_Parser * parser,
ARC_String ** data )
Parameters
[in]parser
[in/out]data the string to parse, will be freed and set to NULL by the end of this function

Definition at line 297 of file parser.c.

297 {
298 //make sure the parser has a language
299 if(parser->language.size == 0){
300 ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), no parser language defined");
301 return;
302 }
303
304 //lex the subdata
305 ARC_Lexer_LexString(parser->lexer, data);
306 if(arc_errno){
307 ARC_DEBUG_LOG_ERROR("ARC_Parser_Parse(parser, data), could not lex the given data");
308 ARC_Lexer_Clear(parser->lexer);
309 return;
310 }
311
312 //set the lexer index to start and get the first tag
313 uint32_t lexerIndex = 0;
314 ARC_ParserTag *startTag = parser->language.data;
315
316 //setup a tag token that will be passed to the creation callback on success
317 ARC_ParserTagToken *tagToken;
318 ARC_ParserTagToken_Create(&tagToken, startTag->tagId);
319
320 //TODO: handle error checks for if parsing fails
321 //recursivly parse from the inital start tag
322 ARC_Bool parsed = ARC_Parser_ParseTag(parser, tagToken, &lexerIndex);
323 ARC_Bool allTokensParsed = lexerIndex == ARC_Lexer_GetTokensSize(parser->lexer);
324
325 //error if anything went wrong
326 if(parsed == ARC_False || allTokensParsed == ARC_False || arc_errno){
327 ARC_Lexer_Clear(parser->lexer);
329
331 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Parser_Parse(parser, data), could not parse the given data at lexer index: %u", lexerIndex);
332 return;
333 }
334
335 //create the data if the creation callback exists
336 if(parser->createDataFn != NULL){
337 (*(parser->createDataFn))(&(parser->data), tagToken, parser->userData);
338 }
339
341 //cleanup
342 ARC_Lexer_Clear(parser->lexer);
343}
#define ARC_Bool
Definition bool.h:10
#define ARC_DEBUG_LOG_ERROR(STR)
Definition errno.h:39
#define ARC_ERRNO_DATA
Definition errno.h:7
void ARC_Lexer_LexString(ARC_Lexer *lexer, ARC_String **data)
creates tokens using a given string with ARC_LexerToken rules
Definition lexer.c:166
void ARC_Lexer_Clear(ARC_Lexer *lexer)
clears all tokens from a lexer (will not clear token rules)
Definition lexer.c:161
uint32_t ARC_Lexer_GetTokensSize(ARC_Lexer *lexer)
gets a token at a given index from a lexer
Definition lexer.c:286
ARC_Bool ARC_Parser_ParseTag(ARC_Parser *parser, ARC_ParserTagToken *tagToken, uint32_t *lexerIndex)
Definition parser.c:188
void ARC_ParserTagToken_Destroy(ARC_ParserTagToken *tagToken)
Definition parser.c:172
void ARC_ParserTagToken_Create(ARC_ParserTagToken **tagToken, uint32_t id)
Definition parser.c:163
a parser type used inside of the parser data create function
Definition parser.h:35

References ARC_Bool, ARC_DEBUG_LOG_ERROR, ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_False, ARC_Lexer_Clear(), ARC_Lexer_GetTokensSize(), ARC_Lexer_LexString(), ARC_Parser_ParseTag(), ARC_ParserTagToken_Create(), ARC_ParserTagToken_Destroy(), ARC_Parser::createDataFn, ARC_Array::data, ARC_Parser::data, ARC_Parser::language, ARC_Parser::lexer, ARC_Array::size, ARC_ParserTag::tagId, and ARC_Parser::userData.

Referenced by ARC_Parser_CreateFromString(), and ARC_Parser_ParseFile().

◆ ARC_Parser_ParseFile()

void ARC_Parser_ParseFile ( ARC_Parser * parser,
ARC_String * path )
Parameters
[in]parser
[in]language

Definition at line 345 of file parser.c.

345 {
346 ARC_String *fileString;
347 ARC_IO_FileToStr(path, &fileString);
348
349 if(fileString == NULL){
351 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Parser_ParseFile(parser, data), could not read file \"%s\"", path->data);
352 return;
353 }
354
355 ARC_Parser_Parse(parser, &fileString);
356}
#define ARC_ERRNO_NULL
Definition errno.h:6
void ARC_IO_FileToStr(ARC_String *path, ARC_String **data)
get string and size from file
Definition io.c:43

References ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_NULL, ARC_IO_FileToStr(), ARC_Parser_Parse(), and ARC_String::data.

◆ ARC_Parser_ParseTag()

ARC_Bool ARC_Parser_ParseTag ( ARC_Parser * parser,
ARC_ParserTagToken * tagToken,
uint32_t * lexerIndex )

Definition at line 188 of file parser.c.

188 {
189 //get the current tag
190 ARC_ParserTag *tag = NULL;
191 for(uint32_t index = 0; index < parser->language.size; index++){
192 ARC_ParserTag *foundTag = ((ARC_ParserTag *)parser->language.data) + index;
193 if(foundTag->tagId == tagToken->id){
194 tag = foundTag;
195 break;
196 }
197 }
198
199 //if the tag was not found can't do much, so throw an error
200 if(tag == NULL){
202 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Parser_ParseTag(parser, subdata, tagId), could not find tag with id: %u", tagToken->id);
203 return ARC_False;
204 }
205
206 //create a vector of tag token to use if a rule is validated, a comparison function is not needed as it will be iterated through
208 ARC_Vector_Create(&(tagToken->tagTokens), NULL, &destroyTokenTagFn);
209
210 //loop through each or section of the tags and tokens
211 for(uint32_t orIndex = 0; orIndex < tag->tokensOrTagsSize; orIndex++){
212 //reset the tag tokens for each or index
213 ARC_Vector_Clear(tagToken->tagTokens);
214
215 //loop through each token or tag to check if the lexed data matches
216 uint32_t lexerCheckIndex = *lexerIndex;
217 ARC_Bool foundRule = ARC_True;
218 for(uint32_t tokenOrTagIndex = 1; tokenOrTagIndex < tag->tokensOrTags[orIndex][0] + 1; tokenOrTagIndex++){
219 //get next tag id to check
220 uint32_t nextTagId = tag->tokensOrTags[orIndex][tokenOrTagIndex];
221
222 //check if it is lambda (can return safely)
223 if(nextTagId == ARC_PARSER_TAG_LAMBDA){
224 break;
225 }
226
227 //if the value isn't a token it is a tag, so recurs if it isn't a token
228 ARC_Bool isToken = ARC_Lexer_IsTokenId(parser->lexer, nextTagId);
229 if(isToken == ARC_False){
230 //create a temporary lexer index in case the rule does not exist
231 uint32_t tempLexerCheckIndex = lexerCheckIndex;
232
233 //create tag token for if the rule works
234 ARC_ParserTagToken *nextTagToken;
235 ARC_ParserTagToken_Create(&nextTagToken, nextTagId);
236
237 //check if the tag works if not break to continue checking next or index
238 foundRule = ARC_Parser_ParseTag(parser, nextTagToken, &tempLexerCheckIndex);
239 if(foundRule == ARC_False){
240 //clean up the tag token
241 ARC_ParserTagToken_Destroy(nextTagToken);
242 break;
243 }
244
245 //add the tag token because rule was found
246 ARC_Vector_Add(tagToken->tagTokens, nextTagToken);
247
248 //increase the lexer check index as a recursed rule was found, and continue checking
249 lexerCheckIndex = tempLexerCheckIndex;
250
251 continue;
252 }
253
254 //check if there is another token that can be used
255 if(lexerCheckIndex >= ARC_Lexer_GetTokensSize(parser->lexer)){
256 //out of tokens to the current or does not work, so break
257 foundRule = ARC_False;
258 break;
259 }
260
261 //get the next token in the lexer and increment the lexers index
262 ARC_LexerToken *token = ARC_Lexer_GetToken(parser->lexer, lexerCheckIndex);
263 lexerCheckIndex++;
264
265 //if the token rule does not match the current token in the current or statement the token rule could not be found for the current or index so break
266 if(token->rule != tag->tokensOrTags[orIndex][tokenOrTagIndex]){
267 foundRule = ARC_False;
268 break;
269 }
270
271 //the rule was a match so create a tag token to store the token in
272 ARC_ParserTagToken *nextTagToken;
273 ARC_ParserTagToken_Create(&nextTagToken, nextTagId);
274 nextTagToken->token = token;
275
276 //add the token to the tag tokens
277 ARC_Vector_Add(tagToken->tagTokens, nextTagToken);
278 }
279
280 //if the rule is found we don't need to check anymore so we can return out
281 if(foundRule == ARC_True){
282 *lexerIndex = lexerCheckIndex;
283
284 //cleanup
285 return ARC_True;
286 }
287 }
288
289 //cleanup
290 ARC_Vector_Destroy(tagToken->tagTokens);
291 tagToken->tagTokens = NULL;
292
293 //no rule was found, so return false
294 return ARC_False;
295}
ARC_LexerToken * ARC_Lexer_GetToken(ARC_Lexer *lexer, uint32_t index)
gets a token at a given index from a lexer
Definition lexer.c:272
ARC_Bool ARC_Lexer_IsTokenId(ARC_Lexer *lexer, uint32_t id)
returns a boolean based on if a given id is a stored token rule id
Definition lexer.c:294
void ARC_ParserTagToken_VectorDestroyDataFn(void *data)
Definition parser.c:182
#define ARC_PARSER_TAG_LAMBDA
basic tag for letting the parser know it is ok to end
Definition parser.h:150
a lexer token type
Definition lexer.h:18
uint32_t rule
Definition lexer.h:19
ARC_LexerToken * token
Definition parser.h:38
uint32_t id
Definition parser.h:36
ARC_Vector * tagTokens
Definition parser.h:39
void(* ARC_Vector_DestroyDataFn)(void *data)
a callback that cleans up memory when it is removed from the vector
Definition vector.h:31
void ARC_Vector_Add(ARC_Vector *vector, void *data)
adds an item to an ARC_Vector
Definition vector.c:67
void ARC_Vector_Destroy(ARC_Vector *vector)
destroys an ARC_Vector
Definition vector.c:51
void ARC_Vector_Clear(ARC_Vector *vector)
clears all items from a vector
Definition vector.c:139
void ARC_Vector_Create(ARC_Vector **vector, ARC_Vector_CompareDataFn *compareDataFn, ARC_Vector_DestroyDataFn *destroyDataFn)
creates an ARC_Vector which is an "expandable" array
Definition vector.c:28

References ARC_Bool, ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_NULL, ARC_False, ARC_Lexer_GetToken(), ARC_Lexer_GetTokensSize(), ARC_Lexer_IsTokenId(), ARC_Parser_ParseTag(), ARC_PARSER_TAG_LAMBDA, ARC_ParserTagToken_Create(), ARC_ParserTagToken_Destroy(), ARC_ParserTagToken_VectorDestroyDataFn(), ARC_True, ARC_Vector_Add(), ARC_Vector_Clear(), ARC_Vector_Create(), ARC_Vector_Destroy(), ARC_Array::data, ARC_ParserTagToken::id, ARC_Parser::language, ARC_Parser::lexer, ARC_LexerToken::rule, ARC_Array::size, ARC_ParserTag::tagId, ARC_ParserTagToken::tagTokens, ARC_ParserTagToken::token, ARC_ParserTag::tokensOrTags, and ARC_ParserTag::tokensOrTagsSize.

Referenced by ARC_Parser_Parse(), and ARC_Parser_ParseTag().

◆ ARC_ParserTagToken_Create()

void ARC_ParserTagToken_Create ( ARC_ParserTagToken ** tagToken,
uint32_t id )

Definition at line 163 of file parser.c.

163 {
164 *tagToken = (ARC_ParserTagToken *)malloc(sizeof(ARC_ParserTagToken));
165
166 (*tagToken)->id = id;
167 (*tagToken)->token = NULL;
168 (*tagToken)->tagTokens = NULL;
169}

References ARC_ParserTagToken::id.

Referenced by ARC_Parser_Parse(), and ARC_Parser_ParseTag().

◆ ARC_ParserTagToken_Destroy()

void ARC_ParserTagToken_Destroy ( ARC_ParserTagToken * tagToken)

Definition at line 172 of file parser.c.

172 {
173 //destroy the tag token vector
174 if(tagToken->tagTokens != NULL){
175 ARC_Vector_Destroy(tagToken->tagTokens);
176 }
177
178 free(tagToken);
179}

References ARC_Vector_Destroy(), and ARC_ParserTagToken::tagTokens.

Referenced by ARC_Parser_Parse(), ARC_Parser_ParseTag(), and ARC_ParserTagToken_VectorDestroyDataFn().

◆ ARC_ParserTagToken_VectorDestroyDataFn()

void ARC_ParserTagToken_VectorDestroyDataFn ( void * data)

Definition at line 182 of file parser.c.

182 {
183 //we can just use the destroy function with casted data
185}

References ARC_ParserTagToken_Destroy().

Referenced by ARC_Parser_ParseTag().