编译原理--NFA转化为DFA问题 下面是个图,但是最小化后A和C为什么不能合并??

发布网友

我来回答

2个回答

热心网友

#include<stdio.h>
#include<malloc.h>
#include<string.h>

void e();
void f();
void t();
void t1();
void e1();

struct Lchar
{
char char_ch;
struct Lchar *next;
}Lchar,*p,*h,*temp;

char ch;
int right;

void e(void)
{
t();
e1();
}

void t(void)
{
f();
t1();
}

void t1(void)
{
if(h->char_ch=='*')
{
h=h->next;
f();
t1();
}
else
if(h->char_ch!='#'&&h->char_ch!=')'&&h->char_ch!='+')
right=0;
}

void e1(void)
{
if(h->char_ch=='+')
{
h=h->next;
t();
e1();
}
else
if(h->char_ch=='#'||h->char_ch==')')
return;
else
right=0;
}

void f()
{
if(h->char_ch=='i')
h=h->next;
else
if(h->char_ch=='(')
{
h=h->next;
e();
if(h->char_ch==')')
h=h->next;
else
right=0;
}
else
right=0;
}

void main(void)
{

right=1;
h=malloc(sizeof(Lchar));//动态生成临时存储空间..
h->next=NULL;//空指针
p=h;//p指向指针h的空间

printf("请输入需语法分析的式子,并以‘#’号结束:\n");
do
{
ch=getchar();//读入字符
// putchar(ch);//输出字符,yuanyoud

if(ch=='i'||ch=='+'||ch=='*'||ch=='('||ch==')'||ch=='#')
{
temp=malloc(sizeof(Lchar));//创建新空间
temp->next=NULL;
temp->char_ch=ch;//指针指向新读入的字符
h->next=temp;//h指向temp的空间
h=h->next;//指针后移
}
else
{
temp=p->next;
printf("\nInput a wrong char!\n Input again:\n");
for(;;)
{
if (temp!=NULL)
printf("%c",temp->char_ch); //输出不符合项后边所有的项
else
break;
temp=temp->next;
}
}
}while(ch!='#');

p=p->next;
h=p;
e();

if(h->char_ch=='#'&&right)
printf("\nOK!\n");
else
printf("\nError!\n");
getchar();
}

参考资料:这只是参考程序 ,你可以自己对照这修改下就ok了

热心网友

看龙书吧,编译上的经典。
怎样实现倒是没有,不过我这里有一个网上淘的简单C语言编译器源码,如果你要我可以发给你。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com