实验三 语法分析的C语言实现
实验三 语法分析的C语言实现时间2026.4.23实验三语法分析的C语言实现一、 实验目的加深对语法分析器工作过程的理解能够采用一种编程语言实现简单的语法分析程序能够使用自己编写的分析程序对简单的程序段进行语法分析。二、实验要求1、 在实验一(用C语言实现词法分析的程序)的基础上实现编写语法分析程序语法分析程序的实现可以采用任何一种编程工具。2、对语法规则有明确的定义3、编写的分析程序能够对实验一的结果进行正确的语法分析4、对于遇到的语法错误能够做出简单的错误处理给出简单的错误提示保证顺利完成语法分析过程三、实验指导1实现算术表达式的运算一准备1.阅读课本有关章节参考P63的表6.3优先关系表。2.初步编制程序。3.准备一组测试数据。二程序要求1程序输入/输出示例输入如下一段C语言源程序32*5.5-5输出输出运算的结果4.0。2. 建议实验一的词法分析结果保存到文件input.c实验二直接从input.c读取一个token将用到的文法规则输出并保存到文件output.c。注NUM由词法分析器返回3可选功能可以根据自身的情况完善语法分析程序的错误处理功能如对遇到的语法错误给出准确的位置和错误类型提示。三、实验指导2用递归下降分析器实现语法分析一准备1.阅读课本有关章节特别是P49的代码明确语言的语法。2.初步编制程序。3.准备一组测试数据。二程序要求1程序输入/输出示例输入如下一段C语言源程序(实现赋值语句或者if语句或者while语句或者都实现)main()a 10*(b2);if (ab) ab else ac;while (a!0) a321*a;输出依次输出所用到的文法规则或出错信息。2. 建议实验一的词法分析结果保存到文件input.c实验二直接从input.c读取一个token将用到的文法规则输出并保存到文件output.c。注ID和NUM由词法分析器返回3可选功能可以根据自身的情况完善语法分析程序的错误处理功能如对遇到的语法错误给出准确的位置和错误类型提示。三、实验指导3用分析表实现语法分析一准备1.阅读课本有关章节参考P52P53的LL1分析法的实现或者P63P65的算符优先文法的实现明确语言的语法。2.初步编制程序。3.准备一组测试数据。二程序要求1程序输入/输出示例输入如下一段C语言源程序(实现赋值语句或者if语句或者while语句或者都实现)main()a 10*(b2);if (ab) ab else ac;while (a!0) a321*a;输出依次输出所用到的文法规则或出错信息。2. 建议实验一的词法分析结果保存到文件input.c实验二直接从input.c读取一个token将用到的文法规则输出并保存到文件output.c。注ID和NUM由词法分析器返回3可选功能可以根据自身的情况完善语法分析程序的错误处理功能如对遇到的语法错误给出准确的位置和错误类型提示。四、实验报告1. 实验目的2. 实验分工3. 程序说明实现的文法说明、主要函数介绍4. 其他说明包括可选功能的实现介绍、编程中遇到的主要问题、可改进的地方5. 运行结果截图显示6. 源程序要求有一定的注释附1main()a 10*(b2);可参考的文法如下0. program ® main(){expression_stmt }1. expression_stmt ® expression ; | ;表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结果。因此这个语句用于赋值和函数调用。2. expression® varexpression | simple-expression3. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。4. simple-expression ® additive-expressionrelopadditive-expression | additive-expression5. relop ® | |!6. additive-expression ® additive-expressionaddopterm | term7. addop ® | -8. term ® termmulopfactor | factor9. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。10. factor ® ( expression) | var | NUM因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个NUM其值由词法分析器确定。附2main()if (ab) ab else ac;可参考的文法如下0. program ® main(){if_stmt }1. if_stmt® if ( expression ) statement | if ( expression ) statementelsestatement条件语句有通常的语义对表达式进行计算非0值表示条件为真引起第一条语句的执行0值表示条件为假引起第二条语句的执行如果它存在的话。这条规则存在典型的“dangling else”二义性可以用一种“最近嵌套”原则解决二义性。建议可实现if_stmt® if ( expression ) statementelsestatement根据自身情况如果要实现不带else的语句。2. statement ® expression ; | ;3. expression® varexpression | simple-expression4. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。5. simple-expression ® additive-expressionrelopadditive-expression | additive-expression6. relop ® | |!7. additive-expression ® additive-expressionaddopterm | term8. addop ® | -9. term ® termmulopfactor | factor10. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。11. factor ® ( expression) | var | NUM因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个NUM其值由词法分析器确定。附3main()while (a!0) a321*a;可参考的文法如下0. program ® main(){while_stmt }1. while-stmt® while(expression)statement2. statement ® expression ; | ;3. expression® varexpression | simple-expression4. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。5. simple-expression ® additive-expressionrelopadditive-expression | additive-expression6. relop ® | |!7. additive-expression ® additive-expressionaddopterm | term8. addop ® | -9. term ® termmulopfactor | factor10. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。11. factor ® ( expression) | var | NUM因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个NUM其值由词法分析器确定。附4三条语句的C语言文法0. program ® main(){statement_list}1. statement_list ® statement_liststatement |ε2. statement ® expression_stmt | if_stmt | while_stmt3. expression_stmt ® expression ; | ;表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结果。因此这个语句用于赋值和函数调用。4. if_stmt® if ( expression ) statement | if ( expression ) statementelsestatement条件语句有通常的语义对表达式进行计算非0值表示条件为真引起第一条语句的执行0值表示条件为假引起第二条语句的执行如果它存在的话。这条规则存在典型的“dangling else”二义性可以用一种“最近嵌套”原则解决二义性。建议可实现if_stmt® if ( expression ) statementelsestatement根据自身情况如果要实现不带else的语句。5. while-stmt® while(expression)statement6. expression® varexpression | simple-expression7. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。8. simple-expression ® additive-expressionrelopadditive-expression | additive-expression9. relop ® | |!10. additive-expression ® additive-expressionaddopterm | term11. addop ® | -12. term ® termmulopfactor | factor13. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。14. factor ® ( expression) | var | NUM因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个NUM其值由词法分析器确定。第二篇dijkstra算法的C语言实现#include stdafx.h#include stdio.h#include#define N 6#define MAX 9999void Path(int *p,int v,int i)int queint tv;queti;int tmppwhile(tmp!v)quetmp;t;tmpptmpquev;for(int kt;k1;--k)if(k!1)printf(%d--,que);else{ printf(%d,que);printf(\n);int main()int cost{{MAX,MAX,MAX,MAX,MAX,MAX},{MAX,MAX,10,MAX,30,100},{MAX,MAX,MAX,50,MAX,MAX},{MAX,MAX,MAX,MAX,MAX,10},{MAX,MAX,MAX,20,MAX,60},{MAX,MAX,MAX,MAX,MAX,MAX}};int Sint distint pint i,j,u,min;for(i1;i0;distcostif(distMAX)0;else p1;1;for(i2;iminMAX;for(j1;jif(!Sdistuj;mindist1;for(j1;jif(!Smincostdist mincostu;for(i2;iprintf(the shortest line 1---%d:%d,i,dist);printf(顶点遍历:);Path(p,1,i);system(pause);