summaryrefslogtreecommitdiff
path: root/42sh/src/parser/parser_utils.h
blob: 142913cf63f6653bebf27748be230320899b647d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef PARSER_UTILS_H
#define PARSER_UTILS_H

#include "ast/ast.h"
#include "ast/ast_accessors.h"
#include "lexer/lexer.h"

#define CMDSIZE 10

enum parser_state
{
    OK,
    ERROR,
};

/**
 * @brief Method used by error_check() but made available to the developper
 * to ease the error management if an error where to occur. It sets state
 * to the `ERROR` value and frees the ast if it is not NULL.
 * @param root The root of the ast that will be freed.
 * @param state The current state of the lexer that will be changed to `ERROR`.
 * @note Because giving NULL for the root argument will not free anything,
 * it can be used to set the state variable to the `ERROR` status.
 */
void cleanup(struct ast *root, enum parser_state *state);

/**
 * @brief This method will return an integer a nonzero value if an error was
 * detected. If so, cleanup() will be called. An error is detected if the state
 * argument is set to `ERROR` or if the token next is of type `TOKEN_ERROR`.
 * @param root The root of the ast to be freed if there is an error.
 * @param state The current state of the parser. Set to `ERROR` if needed.
 * @param next The next token given by the lexer.
 * @note This function allows for quick and efficient error checks:
 *    if (error_check(root, state, next))
 *    {
 *       return NULL;
 *    }
 */
int error_check(struct ast *root, enum parser_state *state, struct token next);

/**
 * @brief This creates a node as an ast_assign and fills it with the variable
 * next and its value found within said token. Data in the token needs to be
 * parsed before doing anything
 * @param next The token containing the value to fill in the ast
 */
struct ast *assign_setup(struct token next);

/**
 * @brief This function returns the number of elements in an ast_list
 * @param lst The ast_list we want to know how much childrens it has
 * @note Tre result is undefined if the ast type is not AST_LIST
 */
size_t list_length(struct ast *lst);

/**
 * @brief This function will fill the token with the appropriate string
 * when encountering a reserved word that we want to use as a word
 * @param next the token to fill
 * @note NULL is set in the token if string cannot be created
 */
void litteral_reserved_word(struct token *next);

/**
 * @brief This function will pop all the token with the same type as the next
 * parameter. This is useful because a lot of grammars can have consecutive
 * tokens of the same type you need to get rid of. Stops when encountering
 * another type of token on the lexer
 * @param type The type we want to get rid of
 * @param lexer The lexer that will give us the tokens
 * @note the function won't do anything if it cannot find the matching type
 */
void clean_cons_tokens(enum token_type type, struct lexer *lexer);
#endif /* ! PARSER_UTILS_H */