struct token_config *config)
{
struct parser p = { 0 };
- struct frame next = { 0 };
struct token *tk = NULL;
int accepted = 0;
void *ret = NULL;
struct frame *tos = &p.stack[p.tos-1];
if (!tk)
tk = tok_copy(token_next(tokens));
- next.sym = tk->num;
- parser_trace(trace, &p, !next.since_newline,
+ parser_trace(trace, &p,
tk, states, non_term, config->known_count);
- if (next.sym == TK_in) {
+ if (tk->num == TK_in) {
tos->indents += 1;
tos->since_newline = 0;
tos->since_indent = 0;
parser_trace_action(trace, "Record");
continue;
}
- if (next.sym == TK_out) {
+ if (tk->num == TK_out) {
if (states[tos->state].reduce_size >= 0 &&
states[tos->state].reduce_size <= tos->since_indent)
goto force_reduce;
// fall through and force a REDUCE (as 'shift'
// will fail).
}
- if (next.sym == TK_newline) {
+ if (tk->num == TK_newline) {
if (!tos->newline_permitted) {
free(tk);
tk = NULL;
goto force_reduce;
}
if (shift(&p, tk->num, 0, tk->num == TK_newline, tk, states)) {
- next.since_newline = !(tk->num == TK_newline);
tk = NULL;
parser_trace_action(trace, "Shift");
continue;
short indents = 0, start_of_line;
err_tk = tok_copy(*tk);
- next.sym = TK_error;
- while (shift(&p, TK_error, 0, !next.since_newline,
+ while (shift(&p, TK_error, 0, 0,
err_tk, states) == 0
&& p.tos > 0)
// discard this state
fprintf(trace, ") ");
}
- void parser_trace(FILE *trace, struct parser *p, int start_of_line,
+ void parser_trace(FILE *trace, struct parser *p,
struct token *tk, const struct state states[],
const char *non_term[], int knowns)
{
fputs(reserved_words[tk->num], trace);
else
text_dump(trace, tk->txt, 20);
- if (start_of_line)
- fputs("/", trace);
fputs("]", trace);
}