编译原理实验二

#include<stdio.h>
#include<string.h>
#define MAX 150//词法分析表的最大容量
#define MAXBUF 255//缓冲区的最大缓冲量
void term();
void lrparser();
void statement();
void yucu();
void expression();
void factor();
char prog[MAXBUF],token[MAX];
char ch;
int syn,p,m,n,sum,kk;
char * rwtab[6]={"begin","if" , "then" , "while"," do", "end"};
/*词法扫描程序:*/
void scaner()
{
  for(m=0;m<MAX;m++)
    token[m]=NULL;
    m=0;sum=0;
    ch=prog[p++];
    while(ch==' ')ch=prog[p++];
if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
{
    while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
    {
    token[m++]=ch;
    ch=prog[p++];//读取下一个字符
    }
    token[m++]='\0';
    ch=prog[--p];
    syn=10;
    for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
    syn=n+1;//给出syn值
    break;
}
    }
else if((ch<='9'&&ch>='0'))
{
    sum=0;
    while(ch<='9'&&ch>='0')
        {
        sum=sum*10+ch-'0';
        ch=prog[p++];
        }

        ch=prog[--p];
        syn=11;
}
else
switch(ch)
{
    case '<':m=0;token[m++]=ch;
    ch=prog[p++];
    if(ch=='>'){
    syn=21;
    token[m++]=ch;
    }
else
    if(ch=='='){
    syn=22;
    token[m++]=ch;
    }
else
{
  syn=20;
  ch=prog[--p];
}

break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[--p];}
break;
case ':':token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}
else
{

syn=17;
ch=prog[--p];
}
break;
case '+':syn=13;token[0]=ch;break;
case '-':syn=14;token[0]=ch;break;
case '*':syn=15;token[0]=ch;break;
case '/' :syn=16;token[0]=ch;break;
case ':=':syn=18;token[0]=ch;break;
case '<>':syn=21;token[0]=ch;break;
case '<=':syn=22;token[0]=ch;break;
case '>=':syn=24;token[0]=ch;break;
case '=':syn=25;token[0]=ch;break;
case ';':syn=26;token[0]=ch;break;
case '(':syn=27;token[0]=ch;break;
case ')':syn=28;token[0]=ch;break;
case '#':syn=0;token[0]=ch;break;
default:syn=-1;
break;
}
}
void statement()
{

if (syn==10)
{
scaner();//读下一个单词符号
if(syn==18)
{
scaner();//读下一个单词符号
expression();//调用expression 函数
}
else
{
printf( "error!");
kk=1;
}
}
else
{
printf( "error!");
kk=1;
}
return;
}
void expression()
{
term();
while(syn==13||syn==14)
{
    scaner();
    term();
}
return;
}
void term()
{
factor();
while(syn==15||syn==16)
{
    scaner();
    factor();
}
    return;
}
void lrparser()
{
if (syn==1)
{//begin
    scaner();
    yucu();
if (syn==6)//end
{
    scaner();
if (syn==0&&kk==0) printf( "success \n");}
else
{
if(kk!=1 ) printf( "error,lose 'end' ! \n");
kk=1;}
}
else
{
printf("error,lose 'begin' ! \n");
kk=1;
}
return;
}
void yucu()
{
statement();
while(syn==26) //;
{
    scaner();
    statement();
}

return;
}
void factor()
{
if(syn==10||syn==11) scaner(); //为标识符或整常数时,读下一个单词符号
else if(syn==27)
{
    scaner();
    expression();
    if(syn==28) scaner();
else {printf("')'错误\n"); kk=1;}
}
else { printf("表达式错误\n"); kk=1;}
return;
}
void main()
{p=0;
printf("*********语法分析程序*******\n");
printf("请输入源程序:\n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
printf("语法分析结束!n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
厦门理工学院编译原理实验二是指在学习编译原理课程中进行的实验,具体涉及到了NFA(非确定有限自动机)转 DFA(确定有限自动机)的相关内容。 NFA和DFA都属于有限状态自动机,用于描述形式语言的模型。NFA相对于DFA而言具有更高的表达能力,因为它在某些状态下可以有多个后继状态。而DFA则是在NFA的基础上进行了优化,通过消除不确定性,使得状态转移更加明确和确定。 实验二的主要目的是通过实践操作,加深对NFA和DFA的理解,并且掌握NFA转DFA的方法。在实验中,我们会先根据给定的正则表达式或自动机图设计一个NFA,然后通过确定状态、转换表和终态等步骤,将NFA转换为DFA。这个转换过程需要考虑NFA中的ε-转移以及多个状态同时转移的情况,从而得到一个等价的DFA。 实验的步骤主要包括:通过给定的正则表达式构建NFA、确定NFA的状态集、计算每个状态的ε-闭包、根据输入符号和ε-闭包进行状态转换,并得到新的状态集和转换表,最后确定DFA的终态。通过这些步骤,我们可以将一个NFA转换为一个等价的DFA,实现了从非确定性到确定性的转变。 在实验过程中,我们需要注意各个状态的转换规则以及ε-闭包的计算和使用,这些是实验中较为重要的部分。通过实际操作和计算,我们可以更好地理解NFA和DFA之间的关系,并且加深对编译原理中有限状态自动机的理解与应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值