improve term count prediction
This commit is contained in:
@@ -23,10 +23,24 @@ void remove_spaces(char *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int count_any_of(const char *s, const char *set)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
for (; *s != '\0'; s++)
|
||||||
|
{
|
||||||
|
if (ft_strchr(set, *s) != NULL)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int arg_len;
|
int arg_len;
|
||||||
|
int terms_count_prediction;
|
||||||
char *input;
|
char *input;
|
||||||
|
|
||||||
if (ac < 2)
|
if (ac < 2)
|
||||||
@@ -59,11 +73,11 @@ int main(int ac, char **av)
|
|||||||
ft_putchar('\n'); // debug
|
ft_putchar('\n'); // debug
|
||||||
|
|
||||||
token tokens[arg_len];
|
token tokens[arg_len];
|
||||||
int token_count = lexerize(input, tokens);
|
int tokens_count = lexerize(input, tokens);
|
||||||
|
|
||||||
ft_putstr("-> token_count : "); // debug
|
ft_putstr("-> tokens_count : "); // debug
|
||||||
ft_putnbr(token_count); // debug
|
ft_putnbr(tokens_count); // debug
|
||||||
ft_putchar('\n'); // debug
|
ft_putchar('\n'); // debug
|
||||||
|
|
||||||
// tmp debug output
|
// tmp debug output
|
||||||
ft_putchar('\n'); // debug
|
ft_putchar('\n'); // debug
|
||||||
@@ -108,12 +122,18 @@ int main(int ac, char **av)
|
|||||||
ft_putchar('\n'); // debug
|
ft_putchar('\n'); // debug
|
||||||
// END tmp debug output
|
// END tmp debug output
|
||||||
|
|
||||||
term terms[token_count / 2];
|
terms_count_prediction = count_any_of(input, "-+=") + 1; // +1 for first term that can have no leading '+'
|
||||||
|
|
||||||
|
ft_putstr("-> terms_count_prediction : "); // debug
|
||||||
|
ft_putnbr(terms_count_prediction); // debug
|
||||||
|
ft_putchar('\n'); // debug
|
||||||
|
|
||||||
|
term terms[terms_count_prediction];
|
||||||
int term_count = parse(tokens, terms);
|
int term_count = parse(tokens, terms);
|
||||||
|
|
||||||
ft_putstr("-> term_count : "); // debug
|
ft_putstr("-> terms_count : "); // debug
|
||||||
ft_putnbr(term_count); // debug
|
ft_putnbr(term_count); // debug
|
||||||
ft_putchar('\n'); // debug
|
ft_putchar('\n'); // debug
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|||||||
40
src/lexer.c
40
src/lexer.c
@@ -152,11 +152,11 @@ static bool token_is_equal(const char *input, int input_pos, int *token_size)
|
|||||||
*/
|
*/
|
||||||
int lexerize(const char *input, token *tokens)
|
int lexerize(const char *input, token *tokens)
|
||||||
{
|
{
|
||||||
int token_count;
|
int tokens_count;
|
||||||
int input_pos;
|
int input_pos;
|
||||||
int token_size;
|
int token_size;
|
||||||
|
|
||||||
token_count = 0;
|
tokens_count = 0;
|
||||||
input_pos = 0;
|
input_pos = 0;
|
||||||
while (input[input_pos])
|
while (input[input_pos])
|
||||||
{
|
{
|
||||||
@@ -169,38 +169,38 @@ int lexerize(const char *input, token *tokens)
|
|||||||
|
|
||||||
if (token_is_variable(input, input_pos, &token_size))
|
if (token_is_variable(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_VARIABLE;
|
tokens[tokens_count].type = TOKEN_VARIABLE;
|
||||||
tokens[token_count].value_char = 'x';
|
tokens[tokens_count].value_char = 'x';
|
||||||
}
|
}
|
||||||
else if (token_is_number_int(input, input_pos, &token_size))
|
else if (token_is_number_int(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_NUMBER_INT;
|
tokens[tokens_count].type = TOKEN_NUMBER_INT;
|
||||||
tokens[token_count].value_int = ft_atoi(&input[input_pos]);
|
tokens[tokens_count].value_int = ft_atoi(&input[input_pos]);
|
||||||
}
|
}
|
||||||
else if (token_is_number_double(input, input_pos, &token_size))
|
else if (token_is_number_double(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_NUMBER_DOUBLE;
|
tokens[tokens_count].type = TOKEN_NUMBER_DOUBLE;
|
||||||
tokens[token_count].value_double = ft_atof(&input[input_pos]);
|
tokens[tokens_count].value_double = ft_atof(&input[input_pos]);
|
||||||
}
|
}
|
||||||
else if (token_is_power(input, input_pos, &token_size))
|
else if (token_is_power(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_POWER;
|
tokens[tokens_count].type = TOKEN_POWER;
|
||||||
tokens[token_count].value_char = '^';
|
tokens[tokens_count].value_char = '^';
|
||||||
}
|
}
|
||||||
else if (token_is_sign(input, input_pos, &token_size))
|
else if (token_is_sign(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_SIGN;
|
tokens[tokens_count].type = TOKEN_SIGN;
|
||||||
tokens[token_count].value_char = input[input_pos];
|
tokens[tokens_count].value_char = input[input_pos];
|
||||||
}
|
}
|
||||||
else if (token_is_factor(input, input_pos, &token_size))
|
else if (token_is_factor(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_FACTOR;
|
tokens[tokens_count].type = TOKEN_FACTOR;
|
||||||
tokens[token_count].value_char = input[input_pos];
|
tokens[tokens_count].value_char = input[input_pos];
|
||||||
}
|
}
|
||||||
else if (token_is_equal(input, input_pos, &token_size))
|
else if (token_is_equal(input, input_pos, &token_size))
|
||||||
{
|
{
|
||||||
tokens[token_count].type = TOKEN_EQUAL;
|
tokens[tokens_count].type = TOKEN_EQUAL;
|
||||||
tokens[token_count].value_char = '=';
|
tokens[tokens_count].value_char = '=';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -209,7 +209,7 @@ int lexerize(const char *input, token *tokens)
|
|||||||
// stop_errors(ERROR_UNKNOWN_TOKEN);
|
// stop_errors(ERROR_UNKNOWN_TOKEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
token_count++;
|
tokens_count++;
|
||||||
if (token_size == 0)
|
if (token_size == 0)
|
||||||
{
|
{
|
||||||
stop_errors(ERROR_UNKNOWN_TOKEN);
|
stop_errors(ERROR_UNKNOWN_TOKEN);
|
||||||
@@ -217,8 +217,8 @@ int lexerize(const char *input, token *tokens)
|
|||||||
input_pos += token_size;
|
input_pos += token_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
tokens[token_count].type = TOKEN_END;
|
tokens[tokens_count].type = TOKEN_END;
|
||||||
tokens[token_count].value_char = '\0';
|
tokens[tokens_count].value_char = '\0';
|
||||||
|
|
||||||
return token_count;
|
return tokens_count;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user