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"
|
#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)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user