华科编译原理实验报告(3)

2020-07-28 10:47

(3)输入字符串if x>2; y=3; end #其结果如下图所示:

实验二 语法分析程序实现

一、实验目的与要求

通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。

二、实验内容

选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比较贴近),设计并实现一个完整的语法分析程序。

输入:源程序以文件的形式输入。

输出:对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,并且给出每一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,并且显示已经归约出的各个文法符号。

三、基本实验题目

以如下文法G1所定义的算术表达式的赋值语句作为分析对象,编写并调试一个语法分析程序。

G1[<赋值语句>]:

<赋值语句> → <变量>:=<算术表达式>

<算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项> <项> → <因式> | <项>*<因式> | <项>/<因式> <因式> → <变量> | <常数> | (<算术表达式>) <变量> → <标识符>

<标识符> → <标识符> <字母> | <标识符> <数字> | <字母> <常数> → <整数> | <浮点数> <整数> → <数字> | <数字> <整数> <浮点数> → ? <整数> | <整数> ? <整数> <字母> → A|B|C|…|X|Y|Z|a|b|c|…|x|y|z <数字> → 0|1|2|…9

四、源程序

#include using namespace std; #include #include

#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]={\,\,\,\,\,\}; ////////////////////////////////////////////////////////// /*词法扫描程序:*/ void scaner() {

for(m=0;m

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(\); kk=1; } } else


华科编译原理实验报告(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:沙门氏菌检验

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: