怎样用C++编写计算器的测试程序

怎样用C++编写计算器的测试程序,第1张

1、使用C/C++程序设计语言和递归下降子程序的方法编写该函数绘图语言的词法分析器。并要求设计一个词法分析器的测试小程序来调用自己编写的词法分析器测试各种不同的输入。

2、词法分析的任务是对输入的字符串形式的源程序按顺序进行扫描,在扫描的同时,根据源语言的词法规则识别具有独立意义的单词(符号),并产生与其好敬等价的属性字流(内部编码)作为输出。通常属性字流即是对识别的单词给出的标记符号的集合。

二、分析与设计

词法分析程序一般具有如下功能:读入字符串形式的源程序识别出具有独立意义的最小语法单位:单词。

事实上,由正规表达式到最小化DFA的转换源程序中的测试生成串部分就是对所输入的单词进行判断,看其是否能被生成的稿让DFA接受(也就是这个单词是否符合正规式定义的要求)。这本质上就是一个简单的词法分析。

定义某种语言的单词,并给出编号。该语言单词包括:保留字、运算符、标识符、常量、格式符等。根据给定的语言子集构造词法分析器。输出为中间文件。

在设计时为了便于理解,不使用内部编码而用枚举对同类型的单词进行标识。例如所有的常量统一用“CONST_ID”对其进行标识,当扫描时遇到常量就输出该常量的值和“CONST_ID”标识。

这里给出词法分析程序大概的设计方法:

1、根据要求写出词法分析的正规文法G;

2、根据正规文法G,写出正则式RE;

3、根据正则式RE,画出NFA;

4、将NFA转化友敬慎为DFA;

5、将DFA转化为mininum state DFA;

6、mininum state DFA就是词法分析程序的流程图,根据此流程图编写相应的词 法分析程序。

以下是较为详细的设计:

①总体结构与模块划分

lz,最好改成这种形式,不要直接消左递归悔猛知闹:

E ->TAE

T ->FMT

F ->(E) | i

A->+|- M->碧猛桥*|/

兄弟,其实这个问题不难,只是我感觉你给的问题不完全,不知道怎么给你解决,要不我给你个递归下降分析方法分析文法的例子吧,你先看看。我估计你看了这个后绝对就明白整体的分析思想了~

文法如下:

S->do s1 begin s2 end while s2

s1->s2mB

s2->AmB

A->B

B->VAL //VAL是所有非关键字的字符字符组和数字

m->+|-|*|/|>|<|=

//////碧灶纯///////*语法递归分析*//悔咐///////////////

int B(int * c,int &q)

{

if(c[q]==13)

{ q++

return 1

}

else if(c[q]==5)

{ q++

return 1

}

else {cout<<"error 'B'"<<endlreturn 0}

}

int A(int * b,int &o)

{

if(B(b,o))

{

return 1

}

else {cout<<"error 'A'"<<endlreturn 0}

}

int OP(int *r,int &v)

{

if(r[v]==6)

{

v++

return 1

}

else if(r[v]==7)

{

v++

return 1

}

else if(r[v]==8)

{

v++

return 1

}

else if(r[v]==9)

{

v++

return 1

}

else if(r[v]==10)

{

v++

return 1

}

else if(r[v]==11)

{

v++

return 1

}

else if(r[v]==12)

{

v++

return 1

}

else {cout<<"error 'OP'"<<endlreturn 0}

}

int S2(int * d,int &h)

{

if(A(d,h))

{

if(OP(d,h))

{

if(B(d,h))

return 1

else {cout<<"条件语句右部出错 "<<endlreturn 0}

}

else {cout<<"条件语句缺少运算符 "<<endlreturn 0}

}

else {cout<<"条件语句左部出错 "<<endlreturn 0}

}

int S1(int * d,int &h)

{

if(S2(d,h))

{

if(OP(d,h))

{

if(B(d,h))

return 1

else {cout<<"循环语句右部出错 "<<endlreturn 0}

}

else {cout<<"循环语句缺少运算符 "<<endlreturn 0}

}

else {cout<<"循环辩前语句左部出错 "<<endlreturn 0}

}

int S(int *a,int &z)

{

if (a[z++]==1)

{

if (S1(a,z))

{

if (a[z++]==2)

{

if (S2(a,z))

{

if(a[z++]==3)

{

if(a[z++]==4)

{

if(S2(a,z))

{

cout<<"语法分析成功!"<<endl

return 1

}

else return 0

}

else {cout<<"error 'while'"<<endlreturn 0}

}

else {cout<<"error 'end'"<<endlreturn 0}

}

else return 0

}

else {cout<<"error 'begin'"<<endlreturn 0}

}

else return 0

}

else {cout<<"error 'do'"<<endlreturn 0}

}

/////////////////////// 语法分析结束 ////////////////////////

词法分析中单词代号 词法分析中可识别到的所有单词

1 do

2 begin

3 end

4 while

5 除关键字以外的所有字符或字符串

6 +

7 -

8 *

9 /

10 =

11 >

12 <

13 数字

14 结束标识符“#”

自己好好琢磨琢磨吧,其实思想挺简单的~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12490755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存