konst, parse_function zvlast

This commit is contained in:
det-fys 2024-12-30 19:08:52 +01:00
parent b5d2e5c506
commit d0b5599c8f

View File

@ -4,22 +4,22 @@
#include "parser.h" #include "parser.h"
/* Vrátí ukazatel na aktuální token */ /* 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); return lex_token(&parser->lexer);
} }
/* Vrátí 1, pokud aktuální token je typu <type> */ /* Vrátí 1, pokud aktuální token je typu <type> */
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; return get_token(parser)->type == type;
} }
/* Vrátí hodnotu tokenu, který je konstanta */ /* 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; return get_token(parser)->val.num;
} }
/* Vrátí index funkce tokenu, který reprezentuje funkci */ /* 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; return get_token(parser)->val.fn_idx;
} }
@ -99,30 +99,8 @@ static struct expr_node *parse_bracketed(struct parser *parser) {
return node; 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_function(struct parser *parser) {
static struct expr_node *parse_factor(struct parser *parser) { struct expr_node *node;
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)) {
struct expr_node *arg_nodes[MAX_MATH_FUNCTION_ARGS]; struct expr_node *arg_nodes[MAX_MATH_FUNCTION_ARGS];
size_t i; size_t i;
size_t fn_idx = token_fn_idx(parser); size_t fn_idx = token_fn_idx(parser);
@ -154,6 +132,33 @@ static struct expr_node *parse_factor(struct parser *parser) {
} }
return node; 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)) { if (token_is(parser, TOK_LEFT_PAREN)) {