- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实验报告
实验题目:语法分析器构造
指导教师:杨健
姓名:杨先宇
班级:计13-4
学号实验成绩:
实验题目
实验二 语法分析器构造
实验目的和要求
借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查,并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。
说明提示:
1. 本实验的优先表可以手工先设计好。
2. 本实验要求中提出的“产出相应的归约信息”意指在语法分析的过程中,一旦产生归约,在程序上产生并最终输出归约产生式序号。
3. 出错类型的产生可预先对应优先表中出错栏列表说明其出错类型,并分别编序,当分析中产生错误时以字符串输出相应表中错误信息。
设计思想与框架
功能描述:LL(1)分析法是一种不带回溯的非递归的自上而下的分析法.其基本思想是 根据输入串的当前输入符号来唯一确定选用某条规则来进行推倒,当这个输入符号与推倒的第一个符号相同时再取输入串的下一个符号,继续确定下一个推倒应选的规则,如此下去,直到推倒出被分析的输入串为止.
1.首先,手工制作一个算符优先表(也可以编程序实现)。
2.将词法分析所得到的预处理文件作为该程序的输入文件,并根据相应的算法提取出算术表达式并转换为输入串,将其保存在strings这个字符数组中,并把表达式中相应常量用字符‘i’来表示,以便规约(以#结束输入串)。
3.其次,初始化符号栈。将输入串里的字符读进a里(a用于表示当前的输入字符),将栈顶元素与a(当前字符)相比较,如果栈顶元素的优先级比a的低或等于则进栈;如果栈顶元素的优先级比a的高则将栈顶指针下移,直到找到一个字符串的优先级比它上一个字符串的优先级低的字符串(该过程为寻找最左素短语),然后将这两个字符中间的符号串寻找匹配的产生式后进行规约,并将其弹出站定,将规约得到的非终结符入栈;栈顶元素的下一个元素优先级低于或等于当前输入的字符串就移进,否则就出错。然后重复c过程,直到输入串结束(遇见#)。(输出相应的移近——规约过程)。
4.重复b和c过程,直到该预处理文件结束(遇见#)。
核心算法
void process(char *temp)
{
int k = 1, j, w, l, m, t = 0, p, q, v, yu = 0;
stack[0] = ;
stack[k] = #;
dangqianfuhao = ;
panduanshengyuzifuchuan(yu);
step = 0;
shuchu(0, -1);
// 这是对#号的处理
//-1代表 0代表= 1代表
char Q;
int i = 0;
do
{
dangqianfuhao = temp[i]; // 取符号
int flag = 0; // 对终结符号的善意假设
for (w = 0; w 8; w++) // 查找运算符表,谁与stack[k]匹配
{
if (stack[k] == word[w])
flag = 1;
}
if (flag == 1)
j = k; // j指向终极符了
else
j = k - 1; // j指向stack中最后一个非终结符
for (w = 0; w 8; w++) // 找出s[j]和当前字符在优先表里的位置
{
if (stack[j] == word[w])
l = w; // l记录了当前字符的终结符类型
if (dangqianfuhao == word[w])
m = w; // 终结符的处理
}
while (M[l][m] == )
{
do
{
Q = stack[j];
int flag = 0; // 再次做出善意假设终结符
for (w = 0; w 8; w++)
{
if (stack[j - 1] == word[w])
flag = 1;
}
if (flag == 1)
j = j - 1;
else
j = j - 2;
for (w = 0; w 8; w++) // 找出s[j]和Q对应优先表里的位置,对决
{
if (stack[j] == word[w])
p = w; // p记录员,代理人
if (Q == word[w])
q = w; // q记录员,代理人
}
文档评论(0)