首页 > 编程知识 正文

c语言算术运算符优先级(改变下列表达式使计算结果比较准确)

时间:2023-05-04 00:27:04 阅读:74468 作者:581

递归下降法判断算术表达式的正确性需要主函数输入输出

要求

实验2递归下降法判断算术表达式的正确性

学习时数:2-4

一、实验的目的和要求

1、了解自上而下语法分析方法

2、用递归下降技术实现句法分析器

二.实验内容

算术表达式的语法是G[E] :

EE T| E-T| T

TTF| T/F| F

f(e )| i

采用递归下降分析法在语法G[E]中对包含算术表达式(、---、/、)的算术表达式)进行语法分析,判断该表达式是否正确。

三.实验步骤

1、准备:阅读教科书相关章节,将上述算术表达式语法改造为ll(1)语法),即消除左递归,提取左公因子);

2、参考课件P52编制递归下降分析程序。

四.测试要求

1、为了降低难度,公式中不含变量,只包含单个无符号整数或I;

2、遇到错误的表达式时,输出错误消息(该信息越详细越好);

3、建议测试公式放在文本文件中,一行放入公式,以分号结尾。 语法分析程序的输出结果写在另一个文本文件中;

4、程序输入输出示例:

输入以下以分号结尾的表达式,并输出结果。

(a ) I; 或1;

输出:正确

(b ); 或1 ) 2;

输出:正确

(c ) i i ) II-) Iii ); 或(1)3)4- (5) 67;

输出:正确

(d ) ) () ); 或()1) *3);

输出:错误,没有右括号

(e ) II(*I/I ); 或123(*4/5) ) ) ) )。

输出:错误

1、语法分析依据的语法; G[E]:EE T| E-T| TTT*F| T/F| FF(E )| i2,给出消除左递归和提取左公因子的语法; g’[ e ]:ete’e’te’|-te’|tft’t’* ft’|/ft’|f(e )| i主函数文件数输入输出(n )为

# include iostream # includecstdiousingnamespacestd; char* lookahead; char ch[100]; void E (; void EN (; void T (; void TN (; void F (; 语音匹配(; 语音错误(; FILE* fin,* fout; voidmatchs(chart ) {cout调用matchss的当前(lookahead )、lookaheadendl。 if ) lookahead==t ) lookahead=lookahead 1; else错误(; }void error () {cout )是error的当前*lookahead:' *lookahead endl; frintf(fout,'现在是*lookahead:'%c ',*lookahead ); 特鲁瓦'故障'; }void E () {cout )调用e当前*lookahead:' *lookahead endl; t (); EN (; }void T (() {cout )调用t当前*lookahead:' *lookahead endl; f (; TN (; }void F () {cout )调用f当前*lookahead:' *lookahead endl; if(lookahead==' ) ) matchs (look ahead ); e (); if(*lookahead==' ) matchs (look ahead ); }else{fprintf(fout,'括号不匹配) ); 错误(; }elseif(lookahead=='I ' ) matchs ) ' I ); }elseerror (; }void TN () {cout )调用TN当前*lookahead:' *lookahead endl; if (* look ahead==' * '|* look ahead=='/' ) {matchs ) lookahead}; f (; TN (; }}void EN () {cout )调用EN当前*lookahead:' *lookahead endl; if(*lookahead==''|) lookahead=='-' ) matchs (look ahead ); t (); EN (; 返回; }}int main ()//打开文件fin=fopen ) ) input.txt )、) r ); fut=fopen(output.txt )、(w ); while(fscanf(fin,' %s ',ch )!=eof(//从文件中读取lookahead=ch; //捕获异常try {E (; if ) lookahead=='; ' ) fprintf(fout,' Sussess n ' ); else错误(; }catch(constchar*msg ) fprintf ) fout,' %sn ',msg ); }cout endl endl; }闪存(fin ); fclose(fout; 输入input.txt

I; I; (I ) i i-) II ) I ) I ) I; () *; III(*I/I ); 输出output.txt

Sussess Sussess Sussess括号不匹配当前为*lookahead:';' 故障当前为* look ahead:' * '故障

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。