mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 49fd7fa443
			
		
	
	
		49fd7fa443
		
	
	
	
	
		
			
			number of tests, all because of the codecs/_multibytecodecs issue described here (it's not a Py3K issue, just something Py3K discovers): http://mail.python.org/pipermail/python-dev/2006-April/064051.html Hye-Shik Chang promised to look for a fix, so no need to fix it here. The tests that are expected to break are: test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecs test_multibytecodec This merge fixes an actual test failure (test_weakref) in this branch, though, so I believe merging is the right thing to do anyway.
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /* Computation of FIRST stets */
 | |
| 
 | |
| #include "pgenheaders.h"
 | |
| #include "grammar.h"
 | |
| #include "token.h"
 | |
| 
 | |
| extern int Py_DebugFlag;
 | |
| 
 | |
| /* Forward */
 | |
| static void calcfirstset(grammar *, dfa *);
 | |
| 
 | |
| void
 | |
| addfirstsets(grammar *g)
 | |
| {
 | |
| 	int i;
 | |
| 	dfa *d;
 | |
| 
 | |
| 	if (Py_DebugFlag)
 | |
| 		printf("Adding FIRST sets ...\n");
 | |
| 	for (i = 0; i < g->g_ndfas; i++) {
 | |
| 		d = &g->g_dfa[i];
 | |
| 		if (d->d_first == NULL)
 | |
| 			calcfirstset(g, d);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void
 | |
| calcfirstset(grammar *g, dfa *d)
 | |
| {
 | |
| 	int i, j;
 | |
| 	state *s;
 | |
| 	arc *a;
 | |
| 	int nsyms;
 | |
| 	int *sym;
 | |
| 	int nbits;
 | |
| 	static bitset dummy;
 | |
| 	bitset result;
 | |
| 	int type;
 | |
| 	dfa *d1;
 | |
| 	label *l0;
 | |
| 	
 | |
| 	if (Py_DebugFlag)
 | |
| 		printf("Calculate FIRST set for '%s'\n", d->d_name);
 | |
| 	
 | |
| 	if (dummy == NULL)
 | |
| 		dummy = newbitset(1);
 | |
| 	if (d->d_first == dummy) {
 | |
| 		fprintf(stderr, "Left-recursion for '%s'\n", d->d_name);
 | |
| 		return;
 | |
| 	}
 | |
| 	if (d->d_first != NULL) {
 | |
| 		fprintf(stderr, "Re-calculating FIRST set for '%s' ???\n",
 | |
| 			d->d_name);
 | |
| 	}
 | |
| 	d->d_first = dummy;
 | |
| 	
 | |
| 	l0 = g->g_ll.ll_label;
 | |
| 	nbits = g->g_ll.ll_nlabels;
 | |
| 	result = newbitset(nbits);
 | |
| 	
 | |
| 	sym = (int *)PyObject_MALLOC(sizeof(int));
 | |
| 	if (sym == NULL)
 | |
| 		Py_FatalError("no mem for new sym in calcfirstset");
 | |
| 	nsyms = 1;
 | |
| 	sym[0] = findlabel(&g->g_ll, d->d_type, (char *)NULL);
 | |
| 	
 | |
| 	s = &d->d_state[d->d_initial];
 | |
| 	for (i = 0; i < s->s_narcs; i++) {
 | |
| 		a = &s->s_arc[i];
 | |
| 		for (j = 0; j < nsyms; j++) {
 | |
| 			if (sym[j] == a->a_lbl)
 | |
| 				break;
 | |
| 		}
 | |
| 		if (j >= nsyms) { /* New label */
 | |
| 			sym = (int *)PyObject_REALLOC(sym, 
 | |
|                                                 sizeof(int) * (nsyms + 1));
 | |
| 			if (sym == NULL)
 | |
| 				Py_FatalError(
 | |
| 				    "no mem to resize sym in calcfirstset");
 | |
| 			sym[nsyms++] = a->a_lbl;
 | |
| 			type = l0[a->a_lbl].lb_type;
 | |
| 			if (ISNONTERMINAL(type)) {
 | |
| 				d1 = PyGrammar_FindDFA(g, type);
 | |
| 				if (d1->d_first == dummy) {
 | |
| 					fprintf(stderr,
 | |
| 						"Left-recursion below '%s'\n",
 | |
| 						d->d_name);
 | |
| 				}
 | |
| 				else {
 | |
| 					if (d1->d_first == NULL)
 | |
| 						calcfirstset(g, d1);
 | |
| 					mergebitset(result,
 | |
| 						    d1->d_first, nbits);
 | |
| 				}
 | |
| 			}
 | |
| 			else if (ISTERMINAL(type)) {
 | |
| 				addbit(result, a->a_lbl);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	d->d_first = result;
 | |
| 	if (Py_DebugFlag) {
 | |
| 		printf("FIRST set for '%s': {", d->d_name);
 | |
| 		for (i = 0; i < nbits; i++) {
 | |
| 			if (testbit(result, i))
 | |
| 				printf(" %s", PyGrammar_LabelRepr(&l0[i]));
 | |
| 		}
 | |
| 		printf(" }\n");
 | |
| 	}
 | |
| 
 | |
| 	PyObject_FREE(sym);
 | |
| }
 |