- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语法分析器
主要任务
明确语法分析器的原理及功能
理解自上而下分析方法的原理
对输入的文法可以消除左递归并提取公共左因子
求出文法的非终结集合——FIRST和FOLLOW集
对输入的算符优先文法,构造算符优先关系表
一.明确语法分析器的原理及功能
语法分析器通过接受词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产生,即判断被识别符号串是否为某语法成分,同时进行语法检查,为后面的语义分析和代码生成作准备。
二.理解自上而下分析方法的原理
自上而下分析法是语法分析分析方法两大类中的其中一个大类,还有一个大类是自下向上的分析方法。所谓自上而下的分析方法,是指对任意输入的符号串,用一切可能的方法,从树根节点,即识别符号出发,根据文法自上而下地为输入串建立一颗语法树。自上而下的分析过程本质上是一种试探过程,该过程反复使用不同规则来谋求匹配输入的符号串。所以,为什么要称为是自上而下的分析方法,原因就在于,这一过程是从识别符号开始,然后建立语法树。
这类分析方法有两大特点:
1.分析过程是带有预测的,对输入符号串要预测属于什么语法成分,然后再根据语法成分的文法建立语法树。
2.自上而下的分析方法可分为确定的和非确定的两种。确定的分析方法需对文法有一定的限制,这种方法相对简单、直观,是目前常用的一种方法。非确定的分析方法对任何输入串试图用一切可能的办法,是一个试探的过程,所以会有失败,故该分析过程需要进行回溯。
其具体的算法为:
使用一个用于存放文法符号的先进后出栈,并利用优先关系可以确定最左素短语是否已形成来决定分析器的动作。如果当前栈顶的终结符号和待输入符号之间的优先关系是.或者=,则表示栈顶符号串未形成最左素短语,此时分析器将移进输入符号。如果当前栈顶的终结符号和待输入符号之间的优先关系是.,则表示已经找到了最左素短语的尾,再从栈顶开始,按优先关系在栈内向左(向前)寻找最左素短语的头,然后分析器将归约最左素短语。如果出现两个终结符号之间不存在优先关系,则表示存在语法错误,分析器将调用出错处理程序。
3)程序设计及调试
×对输入的文法可以消除左递归并提取公共左因子
×求出文法的非终结符集合——first集和follow集
三.部分代码
输入非终结符:
void InputVn()
{
int inErr = 1;
int n,k;
char ch;
while(inErr)
{
printf(\n请输入所有的非终结符,并以#号作为结束符,);
printf(注意:将开始符放在第一位:\n);
scanf(%c, ch);
n = 0;}
输入终结符:
void InputVt()
{
int inErr = 1;
int n,k;
char ch;
while(inErr)
{
printf(\n请输入所有的终结符,并以#号作为结束符:\n);
ch=getchar();
n = 0;}
产生式输入:
void InputP()
{
char ch;
int i = 1, n,num;
printf(\n请输入文法产生式的个数:);
scanf(%d, num);//cinnum;
PNum = num;
getchar(); /*消除回车符*/
printf(\n请输入文法的%d个产生式,并以回车分隔:, num);
printf(\n);
while(i num)
{
printf(第%d个:, i);}
}
加入first集:
void AddFirst(int U, int nCh)
{
struct collectNode *pt, *qt;
int ch;
pt = NULL;
qt = NULL;
if(nCh 100)
{
pt = first[U - 100];
while(NULL != pt)
{
if(pt-nVt == nCh)
break;
else
{
qt = pt;
pt = pt-next;
}
}
if(NULL == pt)
{
pt = (struct collectNode *)malloc(sizeof(struct collectNode));
pt-nVt = nCh;
pt-next = NULL;
if(NULL == first[U - 100])
{
first[U - 100] = pt;
}
else
{
qt-next = pt;
}
pt = pt-next;
}
}
else
文档评论(0)