

/* 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);

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 */

