⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 derives.c

📁 bison源代码.bison 是替代yacc的语法分析程序生成器. yacc是 Yet Another Compiler Compiler的缩写. bison又是什么呐 是一个生成可以分析文本文件结构
💻 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, 675 Mass Ave, Cambridge, MA 02139, 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 "new.h"#include "types.h"#include "gram.h"short **derives;voidset_derives(){  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(){  FREE(derives[ntokens]);  FREE(derives + ntokens);}#ifdef	DEBUGprint_derives(){  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 + -