教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 专业资料 >

算符优先分析算法

来源:网络收集 时间:2026-08-17
导读: 设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。 数学与计算机学院编译原理实验报告 年级 09软工学号姓名 成绩 专业软件工程实验地点主楼指导教师湛燕 实验项目算符优先关

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

数学与计算机学院编译原理实验报告

年级 09软工学号姓名 成绩 专业软件工程实验地点主楼指导教师湛燕

实验项目算符优先关系算法实验日期2012.6.6

一、实验目的和要求

设计一个算符优先分析器,理解优先分析方法的原理。

重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

二、实验内容

使用算符优先分析算法分析下面的文法:

E’ → #E#

E → E+T | T

T → T*F | F

F → P^F | P

P → (E) | i

其中i可以看作是一个终结符,无需作词法分析。具体要求如下:

1、如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;

2、如果输入符号串不是正确句子,则指示出错位置。

三、程序设计

全局变量有一下几个:

static string input;//记录输入串

char s[20];//栈

int top=-1;//栈顶指针

有三个函数:

int analyze(string input);//分析输入的串是否符合标准

void process();//进行归约的函数

int main()

input是一个全局变量,记录输入串,用analyze(input)分析输入的是不是符合标准的字符串,(例如“i+i*i^(i+i)”)如果不符合标准,提示用户重新输入。

进行归约的函数主要思想是:先构造优先关系矩阵,有“<”,“>”,“=”和空格四种关系。Char a 记录栈中最高位的终结符,如果栈中是#E+E,则a 的赋

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

值是“+”,如果形如“#E+”或“#E+i”则a 赋值“+”或“i”。charnowchar 记录当前的字符。a 与 nowchar 按照算符优先关系矩阵找出优先关系。如果优先关系是“<”,则进行移进;如果优先关系是“>”,则进行归约;如果是“=”,则去掉括号或分析成功。

五、代码和截图

自己编写代码如下:

#include <iostream>

#include <string>

using namespace std;

static string input;//输入串

char s[20];//栈

int top=-1;//栈顶指针

char VT[7]={'+','*','^','i','(',')','#'};//终结符

static char matrix[7][7]={

'>','<','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>',' ',' ','>','>',

'<','<','<','<','<','=',' ',

'>','>','>',' ',' ','>','>',

'<','<','<','<','<',' ','='}; //优先关系矩阵,不存在优先关系时为空格

int analyze(string input);//分析输入的串是否符合标准

void process();//规约

int main()

{

//cout<<"输入一个符号串!"<<endl;

int flag=1;

while(flag==1)

{

cout<<"输入一个符号串!"<<endl;

cin>>input;

if(analyze(input)==0)

flag=1;

else

flag=0;

}

cout<<"**********************************************************

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

*"<<endl;

cout<<" 表达式文法算符优先关系表"<<endl;

cout<<endl;

for(inti=0;i<8;i++)

{

cout<<" "<<VT[i];

}

cout<<endl;

cout<<endl;

for(i=0;i<7;i++)

{

cout<<VT[i];

for(int j=0;j<7;j++)

{

cout<<" ";

cout<<matrix[i][j];

}

cout<<endl;

}

//cout<<<<endl;

cout<<"***********************************************************"<<endl;

cout<<"对输入串"<<input<<"的算符优先分析过程如下:"<<endl; process();

cout<<""<<endl;

//cout<<" 栈"<<" 优先关系"<<" 当前符号"<<" 剩余输入串"<<" 移进或规约"<<endl;

cout<<""<<endl;

cout<<""<<endl;

cout<<""<<endl;

return 1;

}

int analyze(string input)//分析输入的串是否符合标准

{

//cout<<input[0]<<input[1]<<input[2]<<input[3]<<endl; intlen = input.length();//获得输入串长度

//cout<<len<<endl;

int flag=0;

//char t;//

//char temp;

for(inti=0;i<len;i++)

{

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

if((input[len-1]!='i')&&(input[len-1]!=')')) { flag=1;break; }//cout<<input[len-1]<<endl; switch(input[i]) { case '(': if(i==0) {} else if(input[i-1]=='^'||'+'||'*') {} else flag=1; break; case ')': if(input[i-1]=='i') {} else flag=1; break; case '*': if(input[i-1]=='i'||')') {}//cout<<i<<flag<<endl; else flag=1; break; case '^': if(input[i-1]=='i'||')') {}//cout<<i<<flag<<endl; else flag=1; break; case '+': if(input[i-1]=='i'||')') {}//cout<<i<<flag<<endl; else flag=1; break; case 'i': { if(input[len-1]=='i') flag=1; else {}

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

}// cout<<i<<flag<<"输入的是正确的字符串!"<<endl; break;

default:

// cout<<flag<<endl;

flag=1;

break;

}

}

//int flag=0;

if(flag==0)

{cout<<"输入的是正确的句子!"<<endl;return 1;}

else

{cout<<"输入的是错误的句子!"<<endl;return 0;}

}

void pr …… 此处隐藏:2460字,全部文档内容请下载后查看。喜欢就下载吧 ……

算符优先分析算法.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/267879.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)