diff --git a/parser.c b/parser.c index 301b6e8..005ace4 100644 --- a/parser.c +++ b/parser.c @@ -4,22 +4,22 @@ #include "parser.h" /* Vrátí ukazatel na aktuální token */ -static struct token *get_token(struct parser *parser) { +static const struct token *get_token(const struct parser *parser) { return lex_token(&parser->lexer); } /* Vrátí 1, pokud aktuální token je typu */ -static int token_is(struct parser *parser, enum token_type type) { +static int token_is(const struct parser *parser, enum token_type type) { return get_token(parser)->type == type; } /* Vrátí hodnotu tokenu, který je konstanta */ -static double token_num(struct parser *parser) { +static double token_num(const struct parser *parser) { return get_token(parser)->val.num; } /* Vrátí index funkce tokenu, který reprezentuje funkci */ -static size_t token_fn_idx(struct parser *parser) { +static size_t token_fn_idx(const struct parser *parser) { return get_token(parser)->val.fn_idx; } @@ -99,30 +99,8 @@ static struct expr_node *parse_bracketed(struct parser *parser) { return node; } -/* Zpracuje část výrazu, která už má nejvyšší precedenci (číselnou konstantu, proměnnou, funkci, nebo výraz obalený závorkami) */ -static struct expr_node *parse_factor(struct parser *parser) { - struct expr_node *node; - - if (token_is(parser, TOK_NUMBER)) { - double val = token_num(parser); - next_token(parser); - if (!(node = node_create_const(val))) { - error_bad_alloc(parser); - return NULL; - } - - return node; - } - - if (accept_token(parser, TOK_VARIABLE)) { - if (!(node = node_create_x())) { - error_bad_alloc(parser); - return NULL; - } - return node; - } - - if (token_is(parser, TOK_FUNCTION)) { +static struct expr_node *parse_function(struct parser *parser) { + struct expr_node *node; struct expr_node *arg_nodes[MAX_MATH_FUNCTION_ARGS]; size_t i; size_t fn_idx = token_fn_idx(parser); @@ -154,6 +132,33 @@ static struct expr_node *parse_factor(struct parser *parser) { } return node; +} + +/* Zpracuje část výrazu, která už má nejvyšší precedenci (číselnou konstantu, proměnnou, funkci, nebo výraz obalený závorkami) */ +static struct expr_node *parse_factor(struct parser *parser) { + struct expr_node *node; + + if (token_is(parser, TOK_NUMBER)) { + double val = token_num(parser); + next_token(parser); + if (!(node = node_create_const(val))) { + error_bad_alloc(parser); + return NULL; + } + + return node; + } + + if (accept_token(parser, TOK_VARIABLE)) { + if (!(node = node_create_x())) { + error_bad_alloc(parser); + return NULL; + } + return node; + } + + if (token_is(parser, TOK_FUNCTION)) { + return parse_function(parser); } if (token_is(parser, TOK_LEFT_PAREN)) {