lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
/* 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_initial;    /* Initial state */
    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, 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, char *str);
int findlabel(labellist *ll, int type, char *str);
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 */