首页
社区
课程
招聘
[已解决] [求助]找编译原理一个例题,数字识别 100.00雪花
发表于: 2018-7-13 10:24 2561

[已解决] [求助]找编译原理一个例题,数字识别 100.00雪花

2018-7-13 10:24
2561
问题描述:
    找编译原理一个例题,数字识别,是个很薄的书上的。具体内容记不清了,很抱歉。大概内容是,给了一个“数字”的状态转换图,当时只给了图,然后根据这个图,可以根据左递归文法判断一个字符串是否是数字,如3.1415926是数字,3.14abc不是,3.14e+08是数字(科学表示法),3.14ebc+08不是。
    根据状态装换图来写程序的话也很简单,就是把每个状态转换单独写一个函数,从初始状态开始,每吃进一个字符的话,就调用相应的状态装换函数,最终状态如果是数字,那就是数字,如果不是数字,那就不是数字。
    简单来说,我在找这个数字的状态转换图,另外,我也比较感兴趣怎么画这个图(当时直接给了图,没说怎么画)。
    毕业n多年了,时不时想起这个问题,感觉还是挺有意思的,自己想不起来了,寻求下网友的力量。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1573
活跃值: (198)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
是这本书么,是的话帮你找
2018-7-19 22:26
0
雪    币: 18
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
应该是这个样子吧,自己手动画而且问题不是很复杂的话,一边想遇到什么一边画圆圈和箭头,最后再看看有没有可以合并的,应该不难
编译器设计这本书第二章就是讲如何做一个词法分析器生成器,说得很详细,应该会有帮助
最后于 2018-7-20 10:53 被OxCL编辑 ,原因:
2018-7-20 10:50
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我找到了当时写的程序,上面记录了题目的页码。
/*
无符号数的识别

编译原理与实践 --张菁
P59
*/
#include<stdio.h>
int M(int S,int t)
{
	switch(S)
	{
	case 0: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 1;

		case '.': return 2;
		case 'E': return 3;
		}
		break;
	case 1: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 1;

		case '.': return 2;
		case 'E': return 3;
		}
		break;
	case 2: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 4;
		}
		break;
	case 3: 
		switch(t)
		{
		case '+':  case '-': return 5;
		}
		break;
	case 4: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 4;

		case 'E': return 3;
		}
		break;
	case 5: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 6;
		}
		break;
	case 6: 
		switch(t)
		{
		case '0':  case '1':  
		case '2':  case '3': 
		case '4':  case '5':  
		case '6':  case '7':
		case '8':  case '9': return 6;
		}
		break;
	}
	return -1;
}
bool Realize(char* buf)
{
	char S=0;  //S=S0
    char c=buf[0];
	int i=1;
	while(c!='\0')
	{
		printf("M(%d,%c)=",S,c); //
		S=M(S,c);
		printf("%d\n",S);        //
		if(S==-1) return false;
		c=buf[i++];
	}
	return ( (S==1||S==4||S==6)?true:false );
}
int main()
{
	char buf[50]={"3.1415928E+10"};

	printf("FA=( {0,1,2,3,4,5,6},{0,1,2,3,4,5,6,7,8,9,.,+,-,E},M,0,{1,4,6} )\n");
	printf("M:\n");
	printf("  M(0,0)=1 ... M(0,9)=1  M(0,.)=2  M(0,E)=3\n");
	printf("  M(1,0)=1 ... M(1,9)=1  M(1,.)=2  M(1,E)=3\n");
	printf("  M(2,0)=4 ... M(2,9)=4\n");
	printf("  M(3,+)=5  M(3,-)=5\n");
	printf("  M(4,0)=4 ... M(4,9)=4  M(4,E)=3\n");
	printf("  M(5,0)=6 ... M(5,9)=6\n");
	printf("  M(6,0)=6 ... M(6,9)=6\n");

	printf("the string is \"%s\"\n",buf);
	if(Realize(buf)) printf("Yes.\n");
	else printf("No.\n");
	return 0;
}


2018-7-27 00:06
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
pdf也找到了,简单看了下,表示很多看不懂。。。
感觉,当时就看到了那个状态转换图,然后脑洞了一把。

2018-7-27 00:41
0
游客
登录 | 注册 方可回帖
返回
//