mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 18:07:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			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_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 */
 | 
