konst, parse_function zvlast
This commit is contained in:
parent
b5d2e5c506
commit
d0b5599c8f
61
parser.c
61
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 <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)) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user