in parsetok.c
static node * parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
int *flags) 函数
step1 . parser_state * ps = PyParser_New(g, start);
--g is static grammar _PyParser_Grammar = {
6,
dfas,
{19, labels},
256
};
--start is predefined macro
#define Py_file_input 257
in Python.h
in parser_state *
PyParser_New(grammar *g, int start)
step 1.1 ps->p_grammar = p;
ps->p_tree = PyNode_New(start), start defines the 'type' of node
因为 node *PyNode_New(int type)
{
node *n = (node *) PyObject_MALLOC(1 * sizeof(node));
if (n == NULL)
return NULL;
n->n_type = type;
n->n_str = NULL;
n->n_lineno = 0;
n->n_nchildren = 0;
n->n_child = NULL;
return n;
}
step1.2 s_reset(&ps->p_stack)
其中static void
s_reset(stack *s)
{
s->s_top = &s->s_base[MAXSTACK];
} 让stack的 s_top 指向s_base最后一个元素
step1.3 s_push(&ps->p_stack, PyGrammar_FindDFA(g, start), ps->p_tree);
其中dfa *
PyGrammar_FindDFA(grammar *g, register int type)
{
register dfa *d;
#if 1
/* Massive speed-up */
d = &g->g_dfa[type - NT_OFFSET]; //type = 257 as predefined, #define NT_OFFSET 256
//so d is one of static dfa dfas[81] member, dfas[1] in graminit.c
//dfas[1]'s type is 257,
assert(d->d_type == type);
return d;
#else
#endif
}
而static int
s_push(register stack *s, dfa *d, node *parent)
{
register stackentry *top;
top = --s->s_top;
top->s_dfa = d;
top->s_parent = parent;
top->s_state = 0;
return 0;
}
top指向前一个element, 赋值该element的s_dfa, s_parent
参见parser.h
typedef struct {
int s_state; /* State in current DFA */
dfa *s_dfa; /* Current DFA */
struct _node *s_parent; /* Where to add next node */
} stackentry;
step 2. for 循环中
step2.1 type = PyTokenizer_Get(tok, &a, &b);
PyParser_AddToken(ps, (int)type, str,
tok->lineno, col_offset,
&(err_ret->expected))
step2.1.1
/* Find out which label this token is */
ilabel = classify(ps, type, str); //for example type=1, str="a"
//it will search static label labels[168] , defined in graminit.c
//and find the pair (1, NULL), return the index of the element in array
step2.1.2
/* Loop until the token is shifted or an error occurred */
for (;;) {
/* Fetch the current dfa and state */
register dfa *d = ps->p_stack.s_top->s_dfa;
register state *s = &d->d_state[ps->p_stack.s_top->s_state];
/* Check accelerator */
if (s->s_lower <= ilabel && ilabel < s->s_upper) {
register int x = s->s_accel[ilabel - s->s_lower];
if (x != -1) {
if (x & (1<<7)) {
/* Push non-terminal */
int nt = (x >> 8) + NT_OFFSET;
int arrow = x & ((1<<7)-1);
dfa *d1 = PyGrammar_FindDFA(
ps->p_grammar, nt);
if ((err = push(&ps->p_stack, nt, d1, =======>push
arrow, lineno, col_offset)) > 0) {
D(printf(" MemError: push\n"));
return err;
}
D(printf(" Push ...\n"));
continue;
}
.....
return E_OK;
}
}
}
这段的关键是push函数,
static int
push(register stack *s, int type, dfa *d, int newstate, int lineno, int col_offset)
{
int err;
register node *n;
n = s->s_top->s_parent;
assert(!s_empty(s));
err = PyNode_AddChild(n, type, (char *)NULL, lineno, col_offset);
if (err)
return err;
s->s_top->s_state = newstate;
return s_push(s, d, CHILD(n, NCH(n)-1));
}
它建立起了一个复杂的数据如图