mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00

d_initial, the first state of a particular DFA in the parser has always been initialized to 0 in the old pgen as well as the new pgen. As this value is not used and the first state of each DFA is assumed to be the first element in the array representing it, remove d_initial from the parser to reduce complexity.
93 lines
2.2 KiB
C
93 lines
2.2 KiB
C
|
|
/* Grammar interface */
|
|
|
|
#ifndef Py_GRAMMAR_H
|
|
#define Py_GRAMMAR_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "bitset.h" /* Sigh... */
|
|
|
|
/* A label of an arc */
|
|
|
|
typedef struct {
|
|
int lb_type;
|
|
char *lb_str;
|
|
} label;
|
|
|
|
#define EMPTY 0 /* Label number 0 is by definition the empty label */
|
|
|
|
/* A list of labels */
|
|
|
|
typedef struct {
|
|
int ll_nlabels;
|
|
label *ll_label;
|
|
} labellist;
|
|
|
|
/* An arc from one state to another */
|
|
|
|
typedef struct {
|
|
short a_lbl; /* Label of this arc */
|
|
short a_arrow; /* State where this arc goes to */
|
|
} arc;
|
|
|
|
/* A state in a DFA */
|
|
|
|
typedef struct {
|
|
int s_narcs;
|
|
arc *s_arc; /* Array of arcs */
|
|
|
|
/* Optional accelerators */
|
|
int s_lower; /* Lowest label index */
|
|
int s_upper; /* Highest label index */
|
|
int *s_accel; /* Accelerator */
|
|
int s_accept; /* Nonzero for accepting state */
|
|
} state;
|
|
|
|
/* A DFA */
|
|
|
|
typedef struct {
|
|
int d_type; /* Non-terminal this represents */
|
|
char *d_name; /* For printing */
|
|
int d_nstates;
|
|
state *d_state; /* Array of states */
|
|
bitset d_first;
|
|
} dfa;
|
|
|
|
/* A grammar */
|
|
|
|
typedef struct {
|
|
int g_ndfas;
|
|
dfa *g_dfa; /* Array of DFAs */
|
|
labellist g_ll;
|
|
int g_start; /* Start symbol of the grammar */
|
|
int g_accel; /* Set if accelerators present */
|
|
} grammar;
|
|
|
|
/* FUNCTIONS */
|
|
|
|
grammar *newgrammar(int start);
|
|
void freegrammar(grammar *g);
|
|
dfa *adddfa(grammar *g, int type, const char *name);
|
|
int addstate(dfa *d);
|
|
void addarc(dfa *d, int from, int to, int lbl);
|
|
dfa *PyGrammar_FindDFA(grammar *g, int type);
|
|
|
|
int addlabel(labellist *ll, int type, const char *str);
|
|
int findlabel(labellist *ll, int type, const char *str);
|
|
const char *PyGrammar_LabelRepr(label *lb);
|
|
void translatelabels(grammar *g);
|
|
|
|
void addfirstsets(grammar *g);
|
|
|
|
void PyGrammar_AddAccelerators(grammar *g);
|
|
void PyGrammar_RemoveAccelerators(grammar *);
|
|
|
|
void printgrammar(grammar *g, FILE *fp);
|
|
void printnonterminals(grammar *g, FILE *fp);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_GRAMMAR_H */
|