📄 derives.c
字号:
/* Match rules with nonterminals for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc.This file is part of Bison, the GNU Compiler Compiler.Bison is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.Bison is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with Bison; see the file COPYING. If not, write tothe Free Software Foundation, Inc., 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. *//* set_derives finds, for each variable (nonterminal), which rules can derive it. It sets up the value of derives so that derives[i - ntokens] points to a vector of rule numbers, terminated with -1. */#include <stdio.h>#include "system.h"#include "alloc.h"#include "types.h"#include "gram.h"void set_derives PARAMS((void));void free_derives PARAMS((void));short **derives;voidset_derives (void){ register int i; register int lhs; register shorts *p; register short *q; register shorts **dset; register shorts *delts; dset = NEW2(nvars, shorts *) - ntokens; delts = NEW2(nrules + 1, shorts); p = delts; for (i = nrules; i > 0; i--) { lhs = rlhs[i]; if (lhs >= 0) { p->next = dset[lhs]; p->value = i; dset[lhs] = p; p++; } } derives = NEW2(nvars, short *) - ntokens; q = NEW2(nvars + nrules, short); for (i = ntokens; i < nsyms; i++) { derives[i] = q; p = dset[i]; while (p) { *q++ = p->value; p = p->next; } *q++ = -1; }#ifdef DEBUG print_derives();#endif FREE(dset + ntokens); FREE(delts);}voidfree_derives (void){ FREE(derives[ntokens]); FREE(derives + ntokens);}#ifdef DEBUGvoidprint_derives (void){ register int i; register short *sp; extern char **tags; printf(_("\n\n\nDERIVES\n\n")); for (i = ntokens; i < nsyms; i++) { printf(_("%s derives"), tags[i]); for (sp = derives[i]; *sp > 0; sp++) { printf(" %d", *sp); } putchar('\n'); } putchar('\n');}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -