| 
									
										
										
										
											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-10-14 12:07:46 +00:00
										 |  |  | #include "grammar.h"
 | 
					
						
							|  |  |  | #include "token.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return the DFA for the given type */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 20:39:37 +09:00
										 |  |  | const dfa * | 
					
						
							| 
									
										
										
										
											2013-08-13 20:18:52 +02:00
										 |  |  | PyGrammar_FindDFA(grammar *g, int type) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Massive speed-up */ | 
					
						
							| 
									
										
										
										
											2019-04-23 20:39:37 +09:00
										 |  |  |     const dfa *d = &g->g_dfa[type - NT_OFFSET]; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     assert(d->d_type == type); | 
					
						
							|  |  |  |     return d; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-07-22 10:30:14 +02:00
										 |  |  |     else if (lb->lb_type < N_TOKENS) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         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; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-07-22 10:30:14 +02:00
										 |  |  |     else { | 
					
						
							|  |  |  |         Py_FatalError("invalid label"); | 
					
						
							| 
									
										
										
										
											2013-07-22 16:34:13 +02:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2013-07-22 10:30:14 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } |