编译原理课程设计理工.docx

上传人:b****1 文档编号:358985 上传时间:2022-10-09 格式:DOCX 页数:18 大小:112.79KB
下载 相关 举报
编译原理课程设计理工.docx_第1页
第1页 / 共18页
编译原理课程设计理工.docx_第2页
第2页 / 共18页
编译原理课程设计理工.docx_第3页
第3页 / 共18页
编译原理课程设计理工.docx_第4页
第4页 / 共18页
编译原理课程设计理工.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

编译原理课程设计理工.docx

《编译原理课程设计理工.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计理工.docx(18页珍藏版)》请在冰豆网上搜索。

编译原理课程设计理工.docx

编译原理课程设计理工

 

《编译原理》课程设计指导

 

河北科技大学信息科学及工程学院

计算机系

2017.5

语法分析

1.目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

2.要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

2.1待分析的简单语言的语法

用扩充的BNF表示如下:

⑴<程序>:

=begin<语句串>end

⑵<语句串>:

=<语句>{;<语句>}

⑶<语句>:

=<赋值语句>

⑷<赋值语句>:

=ID:

=<表达式>

⑸<表达式>:

=<项>{+<项>|-<项>}

⑹<项>:

=<因子>{*<因子>|/<因子>

⑺<因子>:

=ID|NUM|(<表达式>)

2.2要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

例如:

输入begina:

=9;x:

=2*3;b:

=a+xend#

输出success!

输入x:

=a+b*cend#

输出error

2.3语法分析程序的酸法思想

(1)主程序示意图如图2-1所示。

图2-1语法分析主程序示意图

(2)递归下降分析程序示意图如图2-2所示。

(3)语句串分析过程示意图如图2-3所示。

 

图2-3语句串分析示意图

图2-2递归下降分析程序示意图

 

(4)statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。

否是

图2-4statement语句分析函数示意图图2-5expression表达式分析函数示意图

否否

图2-6term分析函数示意图

图2-7factor分析过程示意图

3.语法分析程序的C语言程序源代码

#include"stdio.h"#include"string.h"charprog[100],token[8],ch;char*rwtab[6]={"begin","if","then","while","do","end"};intsyn,p,m,n,sum;intkk;factor();expression();yucu();term();statement();lrparser();scaner();main(){ p=kk=0; printf("\npleaseinputastring(endwith'#'):

\n"); do  {scanf("%c",&ch);    prog[p++]=ch;  }while(ch!

='#'); p=0; scaner(); lrparser(); getch();}lrparser(){ if(syn==1)  {

scaner();/*读下一个单词符号*/    yucu();/*调用yucu()函数;*/    if(syn==6)      {scaner(); if((syn==0)&&(kk==0))

printf("success!

\n"); }    else{if(kk!

=1)printf("thestringhaven'tgota'end'!

\n");    kk=1;  }   } else{printf("haven'tgota'begin'!

\n"); kk=1;      } return;}yucu(){

statement();/*调用函数statement();*/ while(syn==26)  {

scaner();/*读下一个单词符号*/   if(syn!

=6)

statement();/*调用函数statement();*/  } return;}statement(){if(syn==10)  {

scaner();/*读下一个单词符号*/    if(syn==18)      {scaner();/*读下一个单词符号*/ expression();/*调用函数statement();*/      }    else{printf("thesing':

='iswrong!

\n");    kk=1;   }  } else{printf("wrongsentence!

\n"); kk=1;      } return;}expression(){term(); while((syn==13)||(syn==14))   {scaner();/*读下一个单词符号*/     term();/*调用函数term();*/   } return;}term(){factor(); while((syn==15)||(syn==16))   {scaner();/*读下一个单词符号*/     factor();/*调用函数factor();*/   } return;}factor(){if((syn==10)||(syn==11))scaner(); elseif(syn==27)   {scaner();/*读下一个单词符号*/     expression();/*调用函数statement();*/     if(syn==28)

scaner();/*读下一个单词符号*/     else{printf("theerroron'('\n");     kk=1;    }   } else{printf("theexpressionerror!

\n"); kk=1;      } return;} scaner() { sum=0;   for(m=0;m<8;m++)token[m++]=NULL;   m=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>='0')&&(ch<='9')))  {token[m++]=ch;   ch=prog[p++];  }     p--;     syn=10;     token[m++]='\0';     for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0)   {syn=n+1;     break;   }     }   elseif((ch>='0')&&(ch<='9'))     {while((ch>='0')&&(ch<='9')) {sum=sum*10+ch-'0';  ch=prog[p++]; } p--; syn=11;     }   elseswitch(ch)      {case'<':

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

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

':

m=0;   ch=prog[p++];   if(ch=='=')     {syn=18;     }   else     {syn=17;       p--;     }   break; case'+':

syn=13;break; case'-':

syn=14;break; case'*':

syn=15;break; case'/':

syn=16;break; case'(':

syn=27;break; case')':

syn=28;break; case'=':

syn=25;break; case';':

syn=26;break; case'#':

syn=0;break; default:

syn=-1;break;      }   }

4.结果分析

输入begina:

=9;x:

=2*3;b:

=a+xend#后输出success!

如图2-1所示:

图2-8

输入x:

=a+b*cend#后输出error如图2-2所示:

图2-9

5.总结

通过本次试验,了解了语法分析的运行过程,主程序大致流程为:

“置初值”调用scaner函数读下一个单词符号调用IrParse结束。

递归下降分析的大致流程为:

“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。

不成立则“出错处理”。

 

附录语义分析源程序

语义分析源程序

#include"stdio.h"

#include"string.h"

charprog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum,q;

intkk;

struct{charresult1[8];

   charag11[8];

   charop1[8];

   charag21[8];

 }quad[20];

char*factor();

char*expression();

intyucu();

char*term();

intstatement();

intlrparser();

char*newtemp();

scaner();

emit(char*result,char*ag1,char*op,char*ag2);

main()

{intj;

 q=p=kk=0;

 printf("\npleaseinputastring(endwith'#'):

");

 do

  {scanf("%c",&ch);

    prog[p++]=ch;

  }while(ch!

='#');

 p=0;

 scaner();

 lrparser();

if(q>19)printf("tolongsentense!

\n");

elsefor(j=0;j

g

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1