derives.c revision cea198a11f15a2eb071d98491ca9a8bc8cebfbc4
1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Match rules with nonterminals for bison,
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2005 Free
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Software 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
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison 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
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison 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
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with Bison; see the file COPYING.  If not, write to
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Boston, MA 02110-1301, USA.  */
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "derives.h"
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h"
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Linked list of rule numbers.  */
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct rule_list
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct rule_list *next;
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule *value;
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} rule_list;
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule ***derives;
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_derives (void)
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("DERIVES\n", stderr);
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule **rp;
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (rp = derives[i - ntokens]; *rp; ++rp)
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (stderr, "\t\t%3d ", (*rp)->user_number);
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  rule_rhs_print (*rp, stderr);
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("\n\n", stderr);
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectderives_compute (void)
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i;
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number r;
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule **q;
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     whose LHS is NTERM.  */
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_list **dset = xcalloc (nvars, sizeof *dset);
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     Instead of performing NRULES allocations for each, have an array
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     indexed by rule numbers.  */
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_list *delts = xnmalloc (nrules, sizeof *delts);
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (r = nrules - 1; r >= 0; --r)
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symbol_number lhs = rules[r].lhs->number;
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_list *p = &delts[r];
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* A new LHS is found.  */
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      p->next = dset[lhs - ntokens];
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      p->value = &rules[r];
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      dset[lhs - ntokens] = p;
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* DSET contains what we need under the form of a linked list.  Make
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     it a single array.  */
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  derives = xnmalloc (nvars, sizeof *derives);
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  q = xnmalloc (nvars + nrules, sizeof *q);
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_list *p = dset[i - ntokens];
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      derives[i - ntokens] = q;
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (p)
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  *q++ = p->value;
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  p = p->next;
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      *q++ = NULL;
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_derives ();
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (dset);
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (delts);
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectderives_free (void)
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (derives[0]);
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (derives);
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
122