3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 1
7static const char *FNAME =
"kest_expr_parser.c";
76 int min_binding_power,
79 if (!tokens || !tokens->
data)
82 int line = tokens->
line;
97 int left_binding_power;
98 int right_binding_power;
107 if (!lhs)
return NULL;
109 current = current->
next;
111 else if (strcmp(current->
data,
"(") == 0)
120 if (!lhs)
return NULL;
122 if (!current || strcmp(current->
data,
")") != 0)
128 current = current->
next;
139 if (!rhs)
goto pratt_bail;
143 if (!lhs)
goto pratt_bail;
151 current = current->
next;
159 while (current && current != tokens_end)
163 if (!infix_type)
break;
166 left_binding_power = precedence;
169 if (left_binding_power < min_binding_power)
break;
171 current = current->
next;
180 if (!rhs)
goto pratt_bail;
184 if (!bin)
goto pratt_bail;
191 *next_token = current;
void kest_parser_error_at(kest_eff_parsing_state *ps, kest_token_ll *token, const char *msg,...)
int kest_expression_infix_operator_precedence(int infix_type)
int kest_expression_token_infix_type(char *token)
kest_expression * kest_parse_expression(kest_eff_parsing_state *ps, kest_token_ll *tokens, kest_token_ll *tokens_end)
int kest_expression_infix_associativity(int infix_type)
int kest_expression_token_unary_type(char *token)
kest_expression * kest_parse_expression_rec_pratt(kest_eff_parsing_state *ps, kest_token_ll *tokens, kest_token_ll **next_token, kest_token_ll *tokens_end, int min_binding_power, int depth)
#define SUMSUB_PRECEDENCE
#define MULDIV_PRECEDENCE
int kest_expression_detect_constants(kest_expression *expr)
kest_expression * new_m_expression_reference(char *ref_name)
kest_expression * new_m_expression_const(float v)
kest_expression * new_m_expression_unary(int unary_type, kest_expression *rhs)
kest_expression * new_m_expression_binary(int binary_type, kest_expression *arg_1, kest_expression *arg_2)
#define KEST_EXPR_REC_MAX_DEPTH
float token_to_float(char *token)
int token_is_name(char *token)
int token_is_number(char *token)
kest_token_ll * current_token
struct kest_token_ll * next