数学与计算机学院编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与计算机学院编译原理实验报告
年级2005级学号2005430076 姓名赵浩鑫成绩
专业网络工程实验地点主楼402 指导教师何欣枫
实验项目递归下降分析器的设计实验日期
一、实验目的
使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写语法分析程序的方法。
二、实验原理
首先将上述文法改写成EBNF形式,根据递归下降分析算法基本思想编写程序。
递归下降法的实现思想是对应文法中每个非终结符编写一个递归过程。每个过程的功能是识别由该终结符推出的串,当某终结符的产生式有多个候选时按LL(1)形式唯一地确定选择某个候选进行推导。
三、实验要求
1、使用递归下降分析算法分析表达式文法:
exp ::= exp addop term | term
addop ::= + | -
term ::= term mulop factor | factor
mulop ::= * | /
factor ::= (exp) | number
其中number可以是多位的十进制数字串(整数即可),因此这里还需要一个小的词法分析器来得到number的值。
2、该词法分析器以子程序形式出现,当需要进行词法分析时进行调用;
3、能够识别正确和错误的表达式;
4、在进行语法分析的过程中,计算输入表达式的值。
四、实验结果(程序)及分析
1.首先是建立数学表达式的文法EBNF。
expression -> term { addop Term } addop -> "+" | "-"
term -> factor {mulop factor } mulop -> "*" | "/"
factor -> num | "(" expression ")"
2.分析过程
●看第一条非终结产生式
expression -> term { addop Term }
先定义函数int expression(),result值就是我们要处理的表达式的值。右边的产生式中,第一个是term,我们就直接调用term函数完成。然后是0到无限次的addop term,那么用一个循环即可。文法中使用非终结符号addop,直接在代码以'+'||'-'代替addop。代码如下。
int expression () {
int result = term (); //调用term()函数。
while (TOKEN == '+' || TOKEN == '-') //TOKEN用来存放正在分析的字符
{ char tmp = TOKEN;
get_token (); //自定义的取字符的函数
tmp == '+' ? result += term () : result -= term ();
}
return result;
}
●看产生式term -> factor {mulop factor }
int term () {
int result = factor (); //调用函数factor()
while (TOKEN == '*' || TOKEN == '/')
{
char tmp = TOKEN;
get_token ();
tmp == '*' ? result *= factor () : result /= factor ();
}
return result;
}
看产生式factor -> num | "(" expression ")"
int factor () {
int result;
if (TOKEN == '(') //看是不是左括号
{
get_token (); //如果是取下一个字符,并调用expression(),执行完后检查有没有配
对的右括号,如果没有,是不合法的表达式
result = expression ();
match (')');
}
else if(isdigit(TOKEN)) //如果不是左括号看是不是数字,若为数字,调用number()分析
出数值数据,如果不是数字,则为不合法的表达式result = number ();
else
{error=1;
return error;
}
return result;
}
3.运行过程及结果如下:
<1>输入一个合法的表达式:3-(2-7),运行结果:
<2>输入表达式3+(,运行结果为:
<3>输入表达式3+5*6-4,运行结果为: