mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 7f14f0d8a0
			
		
	
	
		7f14f0d8a0
		
	
	
	
	
		
			
			svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
  r81032 | antoine.pitrou | 2010-05-09 17:52:27 +0200 (dim., 09 mai 2010) | 9 lines
  Recorded merge of revisions 81029 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk
  ........
    r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines
    Untabify C files. Will watch buildbots.
  ........
................
		
	
			
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			2.8 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);
 | |
| }
 |