编译原理 实验3 算符优先分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验3 算符优先分析

一、实验目的

通过设计编制调试构造FIRSTVT集、LASTVT集和构造算符优先表、对给定符号串进行分析的程序,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法,对给定的符号串进行分析的方法。

二、实验内容

1. 给定一文法G,输出G的每个非终结符的FIRSTVT集和LASTVT集。

2. 构造算符优先表。

3. 对给定的符号串进行分析,包含符号栈,符号栈栈顶符号和输入串当前符号的优先级,最左素短语和使用的产生式和采取的动作。

三、程序思路

在文法框内输入待判断文法产生式,格式E->a|S,注意左部和右部之间是“->”,每个产生式一行,ENTER键换行。文法结束再输入一行G->#E#

1. 先做文法判断,即可判断文法情况。

2. 若是算符优先文法,则在优先表栏显示优先表。

3. 写入要分析的句子,按回车即可。

4. 在分析过程栏,可以看到整个归约过程情况

四、实验结果

FunctorFirst.h

#include

#include

#include

#include

using namespace std;

#define rightlength 20

#define product_num 20 // 产生式最多个数

#define num_noterminal 26 // 非终结符最多个数

#define num_terminal 26 // 终结符最多个数

struct Production

{

char Left;

char Right[rightlength];

int num;

};

struct VT

{

bool vt[num_noterminal][num_terminal];

};

struct Stack

{

char P;

char a;

};

class CMyDlg

{

public:CMyDlg();

void InputRule();

CString showLastVT();

CString showFirstVT();

CString shownoTerminal(char G[]);

CString showTerminal(char g[]);

CString showLeftS(char S[], int j, int k);

void InitAll();

CString showSentence(CString sen, int start);

CString showStack(char S[], int n);

void Initarry(char arry[], int n);

CString ProdtoCStr(Production prod);

int selectProd(int i, int j, char S[]);

void preFunctor(CString sen);

void insertFirstVT(Stack S[], int &sp, char P, char a);

void insertLastVT(Stack S[], int &sp, char P, char a);

void ShowPreTable();

void createPreTable();

char pretable[num_terminal][num_terminal];

bool like_Q(Production prod, char Q);

void createLastVT();

bool likeQ_(Production prod, char Q);

bool likeQa_(Production prod);

bool like_aQ(Production prod);

bool like_a(Production prod);

bool likea_(Production prod);

bool Dignose(char c);

int findg(char c);

int findG(char c);

void createFirstVT();

void createTerminal();

void createnoTerminal();

void buildProduction(CString s);

bool test(CString s);

void parse(); // 语法分析

CString gram; // 存放文法;

Production production[product_num];

VT FirstVT;

VT LastVT;

int locProduct; // 已有产生式个数

char G[num_noterminal];

char g[num_terminal];

int i_G;

int i_g;

CString m_sen;

};

FunctorFirst.cpp

#include"FunctorFirst.h"

CMyDlg::CMyDlg()

{

}

bool CMyDlg::test(CString s) // 测试是否是算符优先文法

{

bool t = 1;

for (int i = 0;i < s.GetLength() - 1;i++)

if (s[i] > 64 && s[i] < 91 && s[i + 1]>64 && s[i + 1] < 91)

{

t = 0;

break;

}

return t;

}

void CMyDlg::InputRule()

{

string infile;

string line;

cout <<" 请输入语法文件的路径:";

cin >> infile;

cout << endl;

ifstream input(infile.c_str());

if (!input)

{

cout << endl <<"###打不开文件,请确认输入的路径有效###"<< endl;

相关文档
最新文档