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"
/* 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 <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;
}
/* 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)) {