简单的FIRST集演示程序
/*
* 该程序用于计算某个非终结符的 FIRST 集合
* RexfieldVon
* 2013年6月29日19:53:45
* 2013年7月3日22:01:57 修改 GetFIRST 例程以简化驱动例程以及自身结构
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* 三级指针
* 第一级指向整个产生式组
* 第二级指向单个产生式
* 第三级指向产生式符号单元
* 约定:所有的大写字母为非终结符
* 假设:无左递归、FIRST集中不会出现重复符号
*/
char*** GrammerRule; /*
* 初始化文法序列
*/
void InitizationGrammerRule()
{
// 分配表头空间
GrammerRule = (char***)malloc(sizeof(int) * );
memset(GrammerRule, '\0', sizeof(int) * );
// 分配文法空间并写入产生式
// G -> E
GrammerRule['G'] = (char**)malloc(sizeof(int) * );
GrammerRule['G'][] = (char*)malloc();
memcpy(GrammerRule['G'][], "E\0", ); // E
GrammerRule['G'][] = NULL;
// E -> T F
GrammerRule['E'] = (char**)malloc(sizeof(int) * );
GrammerRule['E'][] = (char*)malloc();
memcpy(GrammerRule['E'][], "TF\0", ); // T F
GrammerRule['E'][] = NULL;
// F -> '+' T F | '-' T F | e
GrammerRule['F'] = (char**)malloc(sizeof(int) * );
GrammerRule['F'][] = (char*)malloc();
memcpy(GrammerRule['F'][], "+TF\0", ); // '+' T F
GrammerRule['F'][] = (char*)malloc();
memcpy(GrammerRule['F'][], "-TF\0", ); // '-' T F
GrammerRule['F'][] = (char*)malloc();
memcpy(GrammerRule['F'][], "\0", ); // e (该产生式存在但是为空)
GrammerRule['F'][] = NULL;
// T -> A U
GrammerRule['T'] = (char**)malloc(sizeof(int) * );
GrammerRule['T'][] = (char*)malloc();
memcpy(GrammerRule['T'][], "AU\0", ); // A U
GrammerRule['T'][] = NULL;
// U -> '*' A U | '/' A U | e
GrammerRule['U'] = (char**)malloc(sizeof(int) * );
GrammerRule['U'][] = (char*)malloc();
memcpy(GrammerRule['U'][], "*AU\0", ); // '*' A U
GrammerRule['U'][] = (char*)malloc();
memcpy(GrammerRule['U'][], "/AU\0", ); // '/' A U
GrammerRule['U'][] = (char*)malloc();
memcpy(GrammerRule['U'][], "\0", ); // e (该产生式存在但是为空)
GrammerRule['U'][] = NULL;
// A -> '(' E ')' | d | n
GrammerRule['A'] = (char**)malloc(sizeof(int) * );
GrammerRule['A'][] = (char*)malloc();
memcpy(GrammerRule['A'][], "(E)\0", ); // '(' E ')'
GrammerRule['A'][] = (char*)malloc();
memcpy(GrammerRule['A'][], "d\0", ); // d
GrammerRule['A'][] = (char*)malloc();
memcpy(GrammerRule['A'][], "n\0", ); // n
GrammerRule['A'][] = NULL;
} int GetTerminalCount()
{
int i, TerminalCount = ;
for (i = ; i < ; i++)
{
if (GrammerRule[i] != NULL)
{
int k = ;
while (GrammerRule[i][k] != NULL)
{
int n = ;
while (GrammerRule[i][k][n] != '\0')
{
char c = GrammerRule[i][k][n];
if (c < 'A' || c > 'Z')
{
TerminalCount++;
}
n++;
}
k++;
}
}
}
return TerminalCount;
} /*
* 递归取得 FIRST 集
* Token : char 需要打印的符号
* FIRST : char* FIRST集
* Ptr : int* FIRST集的位置指针
*/
void GetFIRST(char Token, char *FIRST, int *Ptr)
{
if (Token >= 'A' && Token <= 'Z' && GrammerRule[Token] != NULL)
{
int i = ;
while (GrammerRule[Token][i] != NULL)
{
GetFIRST(GrammerRule[Token][i++][], FIRST, Ptr);
}
}
else if (Token < 'A' || Token > 'Z')
{
FIRST[*Ptr] = Token;
*Ptr = *Ptr + ;
}
} /*
* 打印指定非终结符的 FIRST 集
* Token : char 需要打印的符号
* TerminalCount : int 终结符数量
*/
void PrintFIRST(char Token, int TerminalCount)
{
char *FIRST = (char*)malloc(TerminalCount + );
memset(FIRST, '\0', TerminalCount + );
int Ptr = , i;
GetFIRST(Token, FIRST, &Ptr);
printf("FIRST(%c): ", Token);
for (i = ; i < Ptr; i++)
{
if (FIRST[i] == '\0')
{
printf("<e> ");
}
else
{
printf("%c ", FIRST[i]);
}
}
printf("\n");
} int main(int argc, char **argv)
{
InitizationGrammerRule(); // 初始化文法
int TerminalCount = GetTerminalCount();
printf("Terminal Symbol Count: %d\n", TerminalCount);
PrintFIRST('E', TerminalCount);
PrintFIRST('F', TerminalCount);
PrintFIRST('T', TerminalCount);
PrintFIRST('U', TerminalCount);
PrintFIRST('A', TerminalCount);
return ;
}
简单的FIRST集演示程序的更多相关文章
- 简单的FIRST+集演示程序
/* * 该程序用于计算某个非终结符的 FIRST+ 集合 * RexfieldVon * 2013年6月30日16:02:47 */ #include <stdio.h> #includ ...
- 简单的FOLLOW集演示程序
/* * 该程序用于计算某个非终结符的 FOLLOW 集合 * RexfieldVon * 2013年6月30日16:02:47 */ #include <stdio.h> #includ ...
- POJ 2524 (简单并查集) Ubiquitous Religions
题意:有编号为1到n的学生,然后有m组调查,每组调查中有a和b,表示该两个学生有同样的宗教信仰,问最多有多少种不同的宗教信仰 简单并查集 //#define LOCAL #include <io ...
- poj1611 简单并查集
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 32781 Accepted: 15902 De ...
- 1213 How Many Tables(简单并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 简单并查集,统计单独成树的数量. 代码: #include <stdio.h> #i ...
- 【简单并查集】Farm Irrigation
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- 搭建简单的hadoop集群(译文)
本文翻译翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 具体的实 ...
- ACM_“打老虎”的背后(简单并查集)
“打老虎”的背后 Time Limit: 2000/1000ms (Java/Others) Problem Description: “习大大”自担任国家主席以来大力反腐倡廉,各地打击贪腐力度也逐步 ...
随机推荐
- angularjs-googleMap googleMap api地址解析与反解析
1.js:根据地址得到经纬度var myplace=$scope.place;//获取输入的地址var geocoder = new google.maps.Geocoder();//创建geocod ...
- SQL SERVER字符集的研究(中英文字符集,varchar,nvarchar).
一. 试验归类测试SQL: drop table a )) insert into a values('a') insert into a values(N'a') insert into a val ...
- asp.net mvc生命周期学习
ASP.NET MVC是一个扩展性非常强的框架,探究其生命周期对用Mock框架来模拟某些东西,达到单元测试效果,和开发扩展我们的程序是很好的. 生命周期1:创建routetable.把URL映射到ha ...
- php定时执行任务的几个方法
PHP的实现决定了它没有Java和.Net这种AppServer的概念, 而http协议是一个无状态的协议, php只能被用户触发, 被调用, 调用后会自动退出内存, 没有常驻内存, 就没有办法准确的 ...
- 入门3:PHP环境开发搭建(windows)
一.环境需要 硬件环境(最低配置): 双核CPU 8G内存 操作系统环境: Windows(64位)7+ Mac OS X 10.10+ Linux 64位(推荐Ubuntu 14 LTS) /**拓 ...
- python自动开发之第十三天
1.Paramiko模块下的demo.py程序 前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...
- SSH config
add a file named 'config' , place in folder .ssh then you can use "ssh yourname "quickly ...
- bzoj2395: [Balkan 2011]Timeismoney
Description 有n个城市(编号从0..n-1),m条公路(双向的),从中选择n-1条边,使得任意的两个城市能够连通,一条边需要的c的费用和t的时间,定义一个方案的权值v=n-1条边 ...
- ps使用方法续
1.找一张皱折的背景,将需要制作的照片拖入背景层,调整尺寸并裁剪,使之 与背景边框相配, 2.调整-色相饱和度,全图:饱和度-35,明度+10, 3.调整图层改成柔光模式,出来旧照片的效果了, 4.色 ...
- BZOJ 1038 瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...