| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Grammar interface */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | #ifndef Py_GRAMMAR_H
 | 
					
						
							|  |  |  | #define Py_GRAMMAR_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | #include "bitset.h" /* Sigh... */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A label of an arc */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     int		 lb_type; | 
					
						
							|  |  |  |     char	*lb_str; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } label; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EMPTY 0		/* Label number 0 is by definition the empty label */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A list of labels */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     int		 ll_nlabels; | 
					
						
							|  |  |  |     label	*ll_label; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } labellist; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* An arc from one state to another */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     short	a_lbl;		/* Label of this arc */ | 
					
						
							|  |  |  |     short	a_arrow;	/* State where this arc goes to */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } arc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A state in a DFA */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     int		 s_narcs; | 
					
						
							|  |  |  |     arc		*s_arc;		/* Array of arcs */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     /* 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 */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } state; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A DFA */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     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; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } dfa; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A grammar */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     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 */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } grammar; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* FUNCTIONS */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | int addlabel(labellist *ll, int type, char *str); | 
					
						
							|  |  |  | int findlabel(labellist *ll, int type, char *str); | 
					
						
							| 
									
										
										
										
											2012-10-31 13:36:13 -04:00
										 |  |  | const char *PyGrammar_LabelRepr(label *lb); | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | void translatelabels(grammar *g); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | void addfirstsets(grammar *g); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | void PyGrammar_AddAccelerators(grammar *g); | 
					
						
							|  |  |  | void PyGrammar_RemoveAccelerators(grammar *); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | void printgrammar(grammar *g, FILE *fp); | 
					
						
							|  |  |  | void printnonterminals(grammar *g, FILE *fp); | 
					
						
							| 
									
										
										
										
											1993-07-28 09:05:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_GRAMMAR_H */
 |