You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.8 KiB

36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
  1. /* Computation of FIRST stets */
  2. #include "pgenheaders.h"
  3. #include "grammar.h"
  4. #include "token.h"
  5. extern int Py_DebugFlag;
  6. /* Forward */
  7. static void calcfirstset(grammar *, dfa *);
  8. void
  9. addfirstsets(grammar *g)
  10. {
  11. int i;
  12. dfa *d;
  13. if (Py_DebugFlag)
  14. printf("Adding FIRST sets ...\n");
  15. for (i = 0; i < g->g_ndfas; i++) {
  16. d = &g->g_dfa[i];
  17. if (d->d_first == NULL)
  18. calcfirstset(g, d);
  19. }
  20. }
  21. static void
  22. calcfirstset(grammar *g, dfa *d)
  23. {
  24. int i, j;
  25. state *s;
  26. arc *a;
  27. int nsyms;
  28. int *sym;
  29. int nbits;
  30. static bitset dummy;
  31. bitset result;
  32. int type;
  33. dfa *d1;
  34. label *l0;
  35. if (Py_DebugFlag)
  36. printf("Calculate FIRST set for '%s'\n", d->d_name);
  37. if (dummy == NULL)
  38. dummy = newbitset(1);
  39. if (d->d_first == dummy) {
  40. fprintf(stderr, "Left-recursion for '%s'\n", d->d_name);
  41. return;
  42. }
  43. if (d->d_first != NULL) {
  44. fprintf(stderr, "Re-calculating FIRST set for '%s' ???\n",
  45. d->d_name);
  46. }
  47. d->d_first = dummy;
  48. l0 = g->g_ll.ll_label;
  49. nbits = g->g_ll.ll_nlabels;
  50. result = newbitset(nbits);
  51. sym = (int *)PyObject_MALLOC(sizeof(int));
  52. if (sym == NULL)
  53. Py_FatalError("no mem for new sym in calcfirstset");
  54. nsyms = 1;
  55. sym[0] = findlabel(&g->g_ll, d->d_type, (char *)NULL);
  56. s = &d->d_state[d->d_initial];
  57. for (i = 0; i < s->s_narcs; i++) {
  58. a = &s->s_arc[i];
  59. for (j = 0; j < nsyms; j++) {
  60. if (sym[j] == a->a_lbl)
  61. break;
  62. }
  63. if (j >= nsyms) { /* New label */
  64. sym = (int *)PyObject_REALLOC(sym,
  65. sizeof(int) * (nsyms + 1));
  66. if (sym == NULL)
  67. Py_FatalError(
  68. "no mem to resize sym in calcfirstset");
  69. sym[nsyms++] = a->a_lbl;
  70. type = l0[a->a_lbl].lb_type;
  71. if (ISNONTERMINAL(type)) {
  72. d1 = PyGrammar_FindDFA(g, type);
  73. if (d1->d_first == dummy) {
  74. fprintf(stderr,
  75. "Left-recursion below '%s'\n",
  76. d->d_name);
  77. }
  78. else {
  79. if (d1->d_first == NULL)
  80. calcfirstset(g, d1);
  81. mergebitset(result,
  82. d1->d_first, nbits);
  83. }
  84. }
  85. else if (ISTERMINAL(type)) {
  86. addbit(result, a->a_lbl);
  87. }
  88. }
  89. }
  90. d->d_first = result;
  91. if (Py_DebugFlag) {
  92. printf("FIRST set for '%s': {", d->d_name);
  93. for (i = 0; i < nbits; i++) {
  94. if (testbit(result, i))
  95. printf(" %s", PyGrammar_LabelRepr(&l0[i]));
  96. }
  97. printf(" }\n");
  98. }
  99. PyObject_FREE(sym);
  100. }