--- /dev/null
+\r
+/* Grammar interface */\r
+\r
+#ifndef Py_GRAMMAR_H\r
+#define Py_GRAMMAR_H\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#include "bitset.h" /* Sigh... */\r
+\r
+/* A label of an arc */\r
+\r
+typedef struct {\r
+ int lb_type;\r
+ char *lb_str;\r
+} label;\r
+\r
+#define EMPTY 0 /* Label number 0 is by definition the empty label */\r
+\r
+/* A list of labels */\r
+\r
+typedef struct {\r
+ int ll_nlabels;\r
+ label *ll_label;\r
+} labellist;\r
+\r
+/* An arc from one state to another */\r
+\r
+typedef struct {\r
+ short a_lbl; /* Label of this arc */\r
+ short a_arrow; /* State where this arc goes to */\r
+} arc;\r
+\r
+/* A state in a DFA */\r
+\r
+typedef struct {\r
+ int s_narcs;\r
+ arc *s_arc; /* Array of arcs */\r
+ \r
+ /* Optional accelerators */\r
+ int s_lower; /* Lowest label index */\r
+ int s_upper; /* Highest label index */\r
+ int *s_accel; /* Accelerator */\r
+ int s_accept; /* Nonzero for accepting state */\r
+} state;\r
+\r
+/* A DFA */\r
+\r
+typedef struct {\r
+ int d_type; /* Non-terminal this represents */\r
+ char *d_name; /* For printing */\r
+ int d_initial; /* Initial state */\r
+ int d_nstates;\r
+ state *d_state; /* Array of states */\r
+ bitset d_first;\r
+} dfa;\r
+\r
+/* A grammar */\r
+\r
+typedef struct {\r
+ int g_ndfas;\r
+ dfa *g_dfa; /* Array of DFAs */\r
+ labellist g_ll;\r
+ int g_start; /* Start symbol of the grammar */\r
+ int g_accel; /* Set if accelerators present */\r
+} grammar;\r
+\r
+/* FUNCTIONS */\r
+\r
+grammar *newgrammar(int start);\r
+dfa *adddfa(grammar *g, int type, char *name);\r
+int addstate(dfa *d);\r
+void addarc(dfa *d, int from, int to, int lbl);\r
+dfa *PyGrammar_FindDFA(grammar *g, int type);\r
+\r
+int addlabel(labellist *ll, int type, char *str);\r
+int findlabel(labellist *ll, int type, char *str);\r
+char *PyGrammar_LabelRepr(label *lb);\r
+void translatelabels(grammar *g);\r
+\r
+void addfirstsets(grammar *g);\r
+\r
+void PyGrammar_AddAccelerators(grammar *g);\r
+void PyGrammar_RemoveAccelerators(grammar *);\r
+\r
+void printgrammar(grammar *g, FILE *fp);\r
+void printnonterminals(grammar *g, FILE *fp);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif /* !Py_GRAMMAR_H */\r