手机版

编译原理-语法分析器

时间:2025-04-30   来源:未知    
字号:

洛阳理工学院计算机与信息工程系

实验报告日期:2011年5月10日

学号

课程

实验名称B08050423班级编译原理语法分析器B080504姓名实验陈志福

一实验目的

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

二实验要求

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

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

用扩充的BNF表示如下:

<程序>::=begin<语言串>end

<语言串>::=<语句>{;<语句>}

<语句>::=<赋值语句>

<赋值语句>::=ID:=<表达式>

<表达式>::=<项>{+<项>|-<项>}

<项>::=<因子>{*<因子>|/<因子>}

<因子>::=ID|NUM|(<表达式>)

实验要求说明:

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

三实验内容

代码如下:

#include<stdio.h>

#include<iostream.h>

#include<string.h>

#defineMAX150//词法分析表的最大容量

#defineMAXBUF255//缓冲区的最大缓冲量

voidterm();

voidlrparser();

voidstatement();

voidyucu();

voidexpression();

voidfactor();

charprog[MAXBUF],token[MAX];

charch;

intsyn,p,m,n,sum,kk;

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

voidscaner()

{

for(m=0;m<MAX;m++)

token[m]=NULL;

m=0;sum=0;

ch=prog[p++];

while(ch=='')

ch=prog[p++];//读取下一个字符;

if(ch>=65&&ch<=122/*是字母字符*/)

{

while(ch>=65&&ch<=122||ch>=48&&ch<=57)/*为字母字符或数字字

符*/

{

token[m++]=ch;

ch=prog[p++];//读取下一个字符;

}

token[m++]='\0';

p=p-1;

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;//给出syn值;

break;

}

}

elseif(ch>=48&&ch<=57/*ch为数字字符*/)

{

while(ch>=48&&ch<=57/*ch为数字字符*/)

{

sum=sum*10+ch-'0';

ch=prog[p++];//读取下一个字符;

}

p=p-1;//回退一个字符;

syn=11;

}

elseswitch(ch)

{

case'<':m=0;token[m++]=ch;

ch=prog[p++];//读取下一个字符;

if(ch=='>')

{

syn=21;

token[m++]=ch;

}

elseif(ch=='=')

{

syn=22;

token[m++]=ch;

}

else

{

syn=20;

p=p-1;//回退一个字符;

}

break;

case'>':token[m++]=ch;;

ch=prog[p++];//读取下一个字符;

if(ch=='=')

{

syn=24;//将>=的中别码=>syn;

token[m++]=ch;;

}

else

{

syn=23;

p=p-1;//回退一个字符;

}

break;

case':':token[m++]=ch;;

ch=prog[p++];//读取下一个字符;

if(ch=='=')

{

syn=18;

token[m++]=ch;;

}

else

{

syn=17;

p=p-1;//回退一个字符;

}

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=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;

}

}

voidstatement()

{

if(syn==10)

{

scaner();//读下一个单词符号;

if(syn==18)

{

scaner();//读下一个单词符号;

expression();//调用expression函数;

}

else

{

cout<<"赋值符号错误!"<<endl;

kk=1;

}

}

else

{

cout<<"语句错误!"<<endl;

kk=1;

}

return;

}

voidyucu()

{

statement();//调用statement();

while(syn==26)

{

scaner();//读下一个单词符号;

statement();//调用statement()函数;

}

return;

}

voidexpression()

{

term();//调用term函数;

while(syn==13||syn==14)

{scaner();//读下一个单词符号;

term();//调用term函数}

return;

}

voidterm()

{

factor();//调用factor函数;

while(syn==15||syn==16)

{

scaner();//读下一个单词符号;

factor();//调用factor函数;

}

return;

}

voidfactor()

{

if(syn==10||syn==11)

scaner();//读下一个单词符号;

elseif(syn==27)

{

scaner();//读下一个单词符号;

expression();//调用expression()函数;

if(syn==28)

scaner();//读下一个单词符号;

else

{

cout<<"输出')'错误"<<endl;

kk=1;

}

}

else

{

cout<<"输出表达示错误"<<endl;

kk=1;

}

return;

}

voidlrparser()

{

scaner();//读下一个单词符号;

if(syn==1)

{

scaner();//读下一个单词符号;

yucu();//调用yucu函数;

if(syn==6)

{

scaner();//读下一个单词符号;

if(syn==0&&(kk==0))

cout<<"Success"<<endl;

}

else

{

if(kk!=1)

cout<<"缺end'错误!"<<endl;

kk=1;

}

}

else

{

cout<&l …… 此处隐藏:1744字,全部文档内容请下载后查看。喜欢就下载吧 ……

编译原理-语法分析器.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)