| 
									
										
										
										
											2001-11-28 21:34:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Grammar subroutines needed by parser */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-04 03:18:48 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | #include "pgenheaders.h"
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | #include "grammar.h"
 | 
					
						
							|  |  |  | #include "token.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return the DFA for the given type */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dfa * | 
					
						
							| 
									
										
										
										
											2000-07-22 19:20:54 +00:00
										 |  |  | PyGrammar_FindDFA(grammar *g, register int type) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     register dfa *d; | 
					
						
							| 
									
										
										
										
											1994-09-09 11:11:39 +00:00
										 |  |  | #if 1
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Massive speed-up */ | 
					
						
							|  |  |  |     d = &g->g_dfa[type - NT_OFFSET]; | 
					
						
							|  |  |  |     assert(d->d_type == type); | 
					
						
							|  |  |  |     return d; | 
					
						
							| 
									
										
										
										
											1994-09-09 11:11:39 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Old, slow version */ | 
					
						
							|  |  |  |     register int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) { | 
					
						
							|  |  |  |         if (d->d_type == type) | 
					
						
							|  |  |  |             return d; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     assert(0); | 
					
						
							|  |  |  |     /* NOTREACHED */ | 
					
						
							| 
									
										
										
										
											1994-09-09 11:11:39 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-31 13:36:13 -04:00
										 |  |  | const char * | 
					
						
							| 
									
										
										
										
											2000-07-22 19:20:54 +00:00
										 |  |  | PyGrammar_LabelRepr(label *lb) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     static char buf[100]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (lb->lb_type == ENDMARKER) | 
					
						
							|  |  |  |         return "EMPTY"; | 
					
						
							|  |  |  |     else if (ISNONTERMINAL(lb->lb_type)) { | 
					
						
							|  |  |  |         if (lb->lb_str == NULL) { | 
					
						
							|  |  |  |             PyOS_snprintf(buf, sizeof(buf), "NT%d", lb->lb_type); | 
					
						
							|  |  |  |             return buf; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             return lb->lb_str; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         if (lb->lb_str == NULL) | 
					
						
							|  |  |  |             return _PyParser_TokenNames[lb->lb_type]; | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             PyOS_snprintf(buf, sizeof(buf), "%.32s(%.32s)", | 
					
						
							|  |  |  |                 _PyParser_TokenNames[lb->lb_type], lb->lb_str); | 
					
						
							|  |  |  |             return buf; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } |