diff --git a/src/parser/grammar.c b/src/parser/grammar.c index 02098e0..c1457eb 100644 --- a/src/parser/grammar.c +++ b/src/parser/grammar.c @@ -5,6 +5,7 @@ #include #include "grammar_basic.h" +#include "../lexer/lexer.h" // === Static variables @@ -84,11 +85,30 @@ static void add_first_redir(enum rule rule) add_first(rule, TOKEN_REDIR_LEFT_RIGHT); add_first(rule, TOKEN_REDIR_DOUBLE_RIGHT); add_first(rule, TOKEN_REDIR_LEFT_AMP); + add_first(rule, TOKEN_REDIR_RIGHT_AMP); add_first(rule, TOKEN_REDIR_RIGHT_PIPE); } // === Functions +bool is_token_redir(struct token *token) +{ + switch (token->type) + { + case TOKEN_REDIR_LEFT: + case TOKEN_REDIR_RIGHT: + case TOKEN_REDIR_LEFT_RIGHT: + case TOKEN_REDIR_DOUBLE_RIGHT: + case TOKEN_REDIR_LEFT_AMP: + case TOKEN_REDIR_RIGHT_AMP: + case TOKEN_REDIR_RIGHT_PIPE: + return true; + default: + return false; + } +} + + bool grammar_init(void) { // Initialize the firsts map @@ -196,7 +216,9 @@ struct ast *parse_input(struct lexer_context *ctx) if (token->type == TOKEN_NEWLINE || token->type == TOKEN_EOF) { if (token->type == TOKEN_NEWLINE) + { POP_TOKEN(); + } return ast; } diff --git a/src/parser/grammar.h b/src/parser/grammar.h index 5721ee7..80961f1 100644 --- a/src/parser/grammar.h +++ b/src/parser/grammar.h @@ -50,6 +50,10 @@ struct firsts_list { // === Functions +/* @brief: returns true if token has a type redirection (not pipe or IONUMBER). + */ +bool is_token_redir(struct token *token); + /* * @brief Initializes the grammar submodule * @return PARSER_INIT_SUCCESS on success PARSER_INIT_ERROR on error diff --git a/src/parser/grammar_basic.c b/src/parser/grammar_basic.c index a0e0868..d99ba6d 100644 --- a/src/parser/grammar_basic.c +++ b/src/parser/grammar_basic.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 200809L + #include "grammar_basic.h" #include @@ -198,7 +200,7 @@ struct ast *parse_element(struct lexer_context *ctx) token = POP_TOKEN(); return ast_create_word(token->data); } - else if (token->type == TOKEN_IONUMBER || token->type == TOKEN_REDIRECTION) + else if (token->type == TOKEN_IONUMBER || is_token_redir(token)) { return parse_redirection(ctx); }