词法分析器-计算器-设计与实现实验报告

  • 格式:doc
  • 大小:178.50 KB
  • 文档页数:21

下载文档原格式

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

辅导教师张静成绩

st=number(st);

else if(rz[st]=='/')

st=anotation(st);

else st=other(st);

return st;

}

测试结果:

8、心得

通过本次的实验,使我真正的了解词法分析器的实现过程,让我更加深刻领悟词法分析器的实现原理。虽然在本次实验中遇到了各种各样的困难和错误,但在同学们的帮助下我都一一克服了,使得词法分析器能够正确的识别相应的词法和表达式。

在做实验的过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,并且在很多步骤处理上,方法不正确。使结果不能符合要求,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不断进步。编译原理是一门专业学科,对于现阶段的我来说,只

辅导教师张静成绩

实验日期实验时间

1实验名称计算器的设计与实现

2、实验目的

掌握自上而下语法分析方法、自下而上语法分析方法

3、实验要求

(1)实验内容

设计及实现计算表达式的计算器。

表达式中可包含+、-、*、/、(、)等运算符。

(2)实验要求:

对已给的一个二元式形式表达式,能够检查有无语法错误。并指定出错位置。

将表达式的语法树输出(或将语法分析过程输出)。

4、实验原理

根据算符优先分析思想实现语法分析程序。

5、实验步骤

(1)根据文法构造语法分析表。

(2)编写总控程序实现语法分析。

6、算符优先分析表及语法分析程序

算符优先分析表:

语法分析程序:

#include

#include

#define MaxSize 99

void translate(char str[],char exp[]) /*将算术表达式转换成后缀表达式*/ {

struct

{

char data[MaxSize];

int top; /*top为栈顶*/

}op; /*定义一个含data和top的结构体*/

char ch;

int i = 0,t = 0;

op.top = -1;

ch = str[i]; /*将str的每一个数转换成ch*/

i++;

while(ch != '\0') /*ch对应不同的符号的时候对应的转换情况*/

{

switch(ch)

{

case '(': /*当是的时候将此括号存入

栈op*/

op.top++;op.data[op.top]=ch;

break;

case ')':

while(op.data[op.top] != '(') /*括号内的转换优先级最高故先提

取表达式*/

{

exp[t]=op.data[op.top];

op.top--;

t++;

}

op.top--;

break;

case '+':

case '-':

while(op.top != -1&&op.data[op.top] != '(') {

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++; /*恢复可插入位置*/

op.data[op.top] = ch;

break;

case '*':

case '/':

while(op.top == '/'||op.top == '*') /*优先级*/

{

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++;

op.data[op.top] = ch;

break;

case ' ': /*忽略空格排除误操作*/

break;

default:

while(ch >= '0'&&ch <= '9')

{

exp[t] = ch;t++;

ch = str[i];i++;

}

i--;

exp[t] = '#'; /*分隔操作数为了美观也为了以后好

分隔操作数*/

t++;

}

ch = str[i];

i++;

}

while(op.top != -1) /*得到剩下的部分*/

{

exp[t] = op.data[op.top];

t++;

op.top--;

}

exp[t] = '\0'; /*表达式结束*/ }

float cal_value(char exp[]) {

struct

{

float data[MaxSize];

st.top--;

break;

case '/':

if(st.data[st.top] != 0)

st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];

else

{

printf("\n\t除0是错误的");

}

st.top--;

break;

default:

d=0;

while(ch >= '0'&&ch <= '9') /*从后缀表达式中获取操作数

#作用在此体现*/

{

d = 10*d+ch-'0';

ch=exp[t];

t++;

}

st.top++;

st.data[st.top] = d;