still working on parser, plan to rework to parsing first, then calling struct creation callback after with vector of tokens and tags

This commit is contained in:
herbglitch 2024-11-23 19:27:30 -07:00
parent fcc07493d3
commit d69844dab1
9 changed files with 251 additions and 27 deletions

View file

@ -130,6 +130,15 @@ ARC_LexerToken *ARC_Lexer_GetToken(ARC_Lexer *lexer, uint32_t index);
*/
uint32_t ARC_Lexer_GetTokensSize(ARC_Lexer *lexer);
/**
* @brief returns a boolean based on if a lexers rules are continious
*
* @param[in] lexer the lexer to check if its ruls are continious
*
* @return ARC_True if the set rules are continious
*/
ARC_Bool ARC_Lexer_IsContinious(ARC_Lexer *lexer);
/**
* @brief returns a boolean based on if a given id is a stored token rule id
*

View file

@ -6,8 +6,8 @@ extern "C" {
#endif
#include "arc/std/array.h"
//#include "arc/std/bool.h"
#include "arc/std/lexer.h"
#include "arc/std/vector.h"
#include <stdint.h>
/**
@ -28,20 +28,20 @@ typedef void (* ARC_ParserData_DestroyFn)(void *data);
/**
* @brief TODO: write this
*/
typedef void (* ARC_ParserLanguageTag_AddDataFn)(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData);
typedef void (* ARC_ParserTag_AddDataFn)(void **data, uint32_t tagId, uint32_t tagIndex, ARC_LexerToken *token, void *userData);
/**
* @brief a langue tag type for the parser //TODO: explain this better
*/
typedef struct ARC_ParserLanguageTag {
typedef struct ARC_ParserTag {
uint32_t tagId;
uint32_t **tokensOrTags;
uint32_t tokensOrTagsSize;
ARC_ParserLanguageTag_AddDataFn *addDataFn;
ARC_ParserTag_AddDataFn *addDataFn;
void *addUserData;
} ARC_ParserLanguageTag;
} ARC_ParserTag;
/**
* @brief a callback function to initialize the lexer the parser uses with rules
@ -72,6 +72,15 @@ typedef void (* ARC_Parser_InitLexerRulesFn)(ARC_Lexer *lexer);
*/
void ARC_Parser_Create(ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn);
/**
* @brief creates an ARC_Parser type from an arc vector
*
* @param[out] parser ARC_Parser to create
* @param[in] language an vector of ARC_ParserLanguageTags defining a langauge
* @param[in] initLexerRulesFn a callback used to initalize the token rules the lexer within the parser will use
*/
void ARC_Parser_CreateFromVector(ARC_Parser **parser, ARC_Vector *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn);
/**
* @brief creates an ARC_Parser type from a string
*

View file

@ -13,7 +13,7 @@ extern "C" {
<arguments> -> <argument> WHITESPACE OR WHITESPACE <arguments> | <tagOrConstant>
<argument> -> <tagOrConstant> WHITESPACE <argument> | <tagOrConstant>
<tagOrConstant> -> <parserLangageTag> | <constant>
<tagOrConstant> -> <tag> | <constant>
<constant> -> ALPHA_UPPER_CHAR <constantBody>
<constantBody> -> <constantChar> <constantBody> | LAMBDA
@ -26,10 +26,16 @@ extern "C" {
<alphaChar> -> ALPHA_LOWER_CHAR | ALPHA_UPPER_CHAR
*/
/*
* @brief
*/
typedef uint32_t (* ARC_ParserLang_GetConstId)(ARC_String *constant);
/*
* @brief creates a parser for the Parser Lang
*
* @note the rules will be inited for the parser lang
* @note the parsed data will be saved as a vector of ARC_ParserLanguageTag
*
* @param[out] parser the parser to create
*/