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