编译原理 实验3 算符优先分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;