1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Match rules with nonterminals for bison,
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1984, 1989, 2000-2003, 2005, 2009-2012 Free Software
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "derives.h"
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h"
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Linked list of rule numbers.  */
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct rule_list
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct rule_list *next;
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule *value;
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} rule_list;
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule ***derives;
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_derives (void)
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("DERIVES\n", stderr);
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule **rp;
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (rp = derives[i - ntokens]; *rp; ++rp)
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (stderr, "\t\t%3d ", (*rp)->user_number);
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  rule_rhs_print (*rp, stderr);
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("\n\n", stderr);
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectderives_compute (void)
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i;
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number r;
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule **q;
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     whose LHS is NTERM.  */
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_list **dset = xcalloc (nvars, sizeof *dset);
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     Instead of performing NRULES allocations for each, have an array
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     indexed by rule numbers.  */
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_list *delts = xnmalloc (nrules, sizeof *delts);
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (r = nrules - 1; r >= 0; --r)
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symbol_number lhs = rules[r].lhs->number;
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_list *p = &delts[r];
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* A new LHS is found.  */
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      p->next = dset[lhs - ntokens];
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      p->value = &rules[r];
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      dset[lhs - ntokens] = p;
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DSET contains what we need under the form of a linked list.  Make
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     it a single array.  */
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  derives = xnmalloc (nvars, sizeof *derives);
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  q = xnmalloc (nvars + nrules, sizeof *q);
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_list *p = dset[i - ntokens];
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      derives[i - ntokens] = q;
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (p)
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  *q++ = p->value;
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  p = p->next;
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      *q++ = NULL;
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_derives ();
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (dset);
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (delts);
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectderives_free (void)
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (derives[0]);
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (derives);
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
120