Home | History | Annotate | Download | only in Include
      1 
      2 /* Grammar interface */
      3 
      4 #ifndef Py_GRAMMAR_H
      5 #define Py_GRAMMAR_H
      6 #ifdef __cplusplus
      7 extern "C" {
      8 #endif
      9 
     10 #include "bitset.h" /* Sigh... */
     11 
     12 /* A label of an arc */
     13 
     14 typedef struct {
     15     int		 lb_type;
     16     char	*lb_str;
     17 } label;
     18 
     19 #define EMPTY 0		/* Label number 0 is by definition the empty label */
     20 
     21 /* A list of labels */
     22 
     23 typedef struct {
     24     int		 ll_nlabels;
     25     label	*ll_label;
     26 } labellist;
     27 
     28 /* An arc from one state to another */
     29 
     30 typedef struct {
     31     short	a_lbl;		/* Label of this arc */
     32     short	a_arrow;	/* State where this arc goes to */
     33 } arc;
     34 
     35 /* A state in a DFA */
     36 
     37 typedef struct {
     38     int		 s_narcs;
     39     arc		*s_arc;		/* Array of arcs */
     40 
     41     /* Optional accelerators */
     42     int		 s_lower;	/* Lowest label index */
     43     int		 s_upper;	/* Highest label index */
     44     int		*s_accel;	/* Accelerator */
     45     int		 s_accept;	/* Nonzero for accepting state */
     46 } state;
     47 
     48 /* A DFA */
     49 
     50 typedef struct {
     51     int		 d_type;	/* Non-terminal this represents */
     52     char	*d_name;	/* For printing */
     53     int		 d_initial;	/* Initial state */
     54     int		 d_nstates;
     55     state	*d_state;	/* Array of states */
     56     bitset	 d_first;
     57 } dfa;
     58 
     59 /* A grammar */
     60 
     61 typedef struct {
     62     int		 g_ndfas;
     63     dfa		*g_dfa;		/* Array of DFAs */
     64     labellist	 g_ll;
     65     int		 g_start;	/* Start symbol of the grammar */
     66     int		 g_accel;	/* Set if accelerators present */
     67 } grammar;
     68 
     69 /* FUNCTIONS */
     70 
     71 grammar *newgrammar(int start);
     72 void freegrammar(grammar *g);
     73 dfa *adddfa(grammar *g, int type, const char *name);
     74 int addstate(dfa *d);
     75 void addarc(dfa *d, int from, int to, int lbl);
     76 dfa *PyGrammar_FindDFA(grammar *g, int type);
     77 
     78 int addlabel(labellist *ll, int type, const char *str);
     79 int findlabel(labellist *ll, int type, const char *str);
     80 const char *PyGrammar_LabelRepr(label *lb);
     81 void translatelabels(grammar *g);
     82 
     83 void addfirstsets(grammar *g);
     84 
     85 void PyGrammar_AddAccelerators(grammar *g);
     86 void PyGrammar_RemoveAccelerators(grammar *);
     87 
     88 void printgrammar(grammar *g, FILE *fp);
     89 void printnonterminals(grammar *g, FILE *fp);
     90 
     91 #ifdef __cplusplus
     92 }
     93 #endif
     94 #endif /* !Py_GRAMMAR_H */
     95