【编译原理】自顶向下语法分析报告方法的实现

更新时间:2023-09-05 02:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

【编译原理】自顶向下语法分析报告方法的实现

实验报告

【编译原理】自顶向下语法分析报告方法的实现

实验项目列表

2

【编译原理】自顶向下语法分析报告方法的实现

一、实验名称

自顶向下语法分析方法的实现

二、实验目的

1.掌握自顶向下语法分析的方法;

2.运用编程的手段实现自顶向下语法分析。

三、实验内容和要求

四、实验环境

1.硬件环境:PC机

2.软件环境:Windows操作系统,VC++集成开发环境五、算法设计思想

六、主要问题与解决方法

3

【编译原理】自顶向下语法分析报告方法的实现

七、实验结果

以下是程序的用户运行界面截图:

4

【编译原理】自顶向下语法分析报告方法的实现

5

【编译原理】自顶向下语法分析报告方法的实现

6

【编译原理】自顶向下语法分析报告方法的实现

7

【编译原理】自顶向下语法分析报告方法的实现

八、体会、质疑、建议

九、源代码

#include<fstream>

#include<sstream>

#include<iostream>

#include<vector>

#include<string>

#include<windows.h>

#include<iterator>

#include<algorithm>

#include<stdlib.h>

#define M 20

using namespace std;

void gotoxy(int x,int y){

COORD coord;

8

【编译原理】自顶向下语法分析报告方法的实现

coord.X=x;

coord.Y=y;

SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );

}

class table

{

public:

void read();

friend class an_process;

string find_str(char row,char col);

private:

string matrix[M][M];

char start;

vector<string> vec_row;

vector<string> vec_col;

};

class sentence

9

【编译原理】自顶向下语法分析报告方法的实现

{

public:

void read_in();

friend class an_process;

private:

string str_input;

};

class an_process

{

public:

void analyse(const table LL1_table,const sentence input);

void write_result();

void print2(int x,int y);

private:

vector<int> step;

vector<vector<char> > stack_note;

vector<string> remain;

vector<string> production;

};

10

【编译原理】自顶向下语法分析报告方法的实现

void table::read()

{

string a,str;

char x,y;

int linenum = 0;

char line[1024]={0};

ifstream infile("table1.txt");

if(!infile)

{

cerr<<"错误!无法存储用户数据!\n";

}

while(infile.getline(line,sizeof(line)))

{

stringstream word(line);

if(linenum>1)

{

if(word>>x&&word>>y&&word>>str)

{

11

【编译原理】自顶向下语法分析报告方法的实现

matrix[x-48][y-48]=str;

/*cout<<x<<" ";

cout<<y<<" ";

cout<<matrix[x-48][y-48]<<" ";*/

}

}

while(word>>a&&linenum<2)

{

if(linenum==0)

{

vec_col.push_back(a);

/*cout<<a<<" ";*/

}

else if(linenum==1)

{

vec_row.push_back(a);

/* cout<<a<<" ";*/

}

}

12

【编译原理】自顶向下语法分析报告方法的实现

/*cout<<endl;*/

linenum++;

}

start=vec_col[0][0];

/* for(int icnt=0;icnt<vec_col.size();icnt++)

{

cout<<vec_col[icnt]<<" ";

}*/

}

string table::find_str(char row,char col)

{

for(int x=0;x<vec_col.size();x++)

for(int y=0;y<vec_row.size();y++)

{

if(row==vec_col[x][0]&&col==vec_row[y][0])

{

return matrix[x+1][y+1];

}

}

13

【编译原理】自顶向下语法分析报告方法的实现

return"";

}

void an_process::analyse(table LL1_table,sentence input) {

int icnt=0,jcnt=0,kcnt;

string ac,prod="",re="";

vector<char> stack;

char Now_word=input.str_input[icnt];

char NOW_state=LL1_table.start;

string::const_iterator Eiter;

string::const_iterator Biter;

stack.push_back('#');

stack.push_back(NOW_state);

for(;icnt<input.str_input.size();)

{

step.push_back(++jcnt);

stack_note.push_back(stack);

for(kcnt=icnt;kcnt<input.str_input.size();kcnt++)

{

14

【编译原理】自顶向下语法分析报告方法的实现

re=re+input.str_input[kcnt];

}

re=re+"#";

remain.push_back(re);

re.erase();

Now_word=input.str_input[icnt];

NOW_state=stack.back();

if(NOW_state==Now_word)

{

stack.erase(stack.end()-1);

icnt++;

production.push_back("(匹配)");

}

else

{

ac=LL1_table.find_str(NOW_state,Now_word);

Biter=ac.begin();

Biter--;

Eiter=ac.end();

Eiter--;

15

【编译原理】自顶向下语法分析报告方法的实现

if(ac=="ε")

{

prod=prod+NOW_state;

prod=prod+"→";

prod=prod+"ε";

stack.erase(stack.end()-1);

production.push_back(prod);

prod.erase();

}

else if(ac!="")

{

stack.erase(stack.end()-1);

prod.empty();

prod=prod+NOW_state;

prod=prod+"→"+ac;

production.push_back(prod);

prod.erase();

for(;Eiter!=Biter;Eiter--)

{

16

【编译原理】自顶向下语法分析报告方法的实现

stack.push_back(*Eiter);

}

}

else

{

cout<<"分析失败\n";

exit(0);

}

}

}

if(stack.size()!=1||stack.back()!='#')

{

cout<<"分析失败\n";

exit(0);

}

}

void an_process::write_result()

{

17

【编译原理】自顶向下语法分析报告方法的实现

step.push_back(step.back()+1);

vector<char> a;

a.push_back('#');

stack_note.push_back(a);

remain.push_back("#");

production.push_back("接受");

gotoxy(27,1);

cout<<"输入串"<<'"'<<remain[0];

cout<<"\b"<<'"'<<"的分析过程"<<endl<<endl;

print2(step.size()+1,4);

vector<int>::const_iterator iter1=step.begin();

vector<vector<char> >::const_iterator iter2=stack_note.begin(); vector<string>::const_iterator iter3=remain.begin();

vector<string>::const_iterator iter4=production.begin(); gotoxy(8,4);

cout<<"步骤";

gotoxy(27,4);

cout<<"分析栈";

gotoxy(44,4);

cout<<"剩余输入串";

18

【编译原理】自顶向下语法分析报告方法的实现

gotoxy(63,4);

cout<<"所用产生式";

for(int xy=0;iter1!=step.end();iter1++)

{

gotoxy(9,xy+6);

cout<<(*iter1);

xy=xy+2;

}

for(xy=0;iter2!=stack_note.end();iter2++) {

gotoxy(27,xy+6);

for(int icnt=0;icnt<(*iter2).size();icnt++) {

cout<<(*iter2)[icnt];

}

xy=xy+2;

}

for(xy=0;iter3!=remain.end();iter3++)

{

gotoxy(44,xy+6);

19

本文来源:https://www.bwwdw.com/article/ah6i.html

Top