2026.4.14实验三:语法分析的C语言实现及要求

张开发
2026/4/18 1:46:16 15 分钟阅读

分享文章

2026.4.14实验三:语法分析的C语言实现及要求
实验三 语法分析的C语言实现时间2026.4.14实验三语法分析的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.先去阅读一下课本里有关的各个章节再去参考P52到P53那里关于LL1分析法的实现情况或者参考P63到P65那里算符优先文法的实现情况从而明确语言的语法。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. 以下是改写后的程序标记为“主函数”其包含表达式语句、。1. 表达式语句可表示为表达式加上分号 或者仅仅是分号。有一种表达式语句它存在一个可选的表达式该表达式之后跟着分号。就这般的表达式来说通常会求出它们其中一方的结果。由此可见这个语句是被用于进行赋值操作以及函数调用的。2. “expression®”其中“var”等于“expression”或者是“simple-expression”。3. var ® ID | IDexpression那表达式它是这样的是一个变量引用接着跟着赋值符号也就是等号再然后跟着一个表达式或者它就是一个简单的表达式。赋值的语义是这样的首先要找到由变量var的地址接着对赋值符右边的子表达式进行求值然后把这个子表达式的值存储到给定的地址当中。这个值也作为整个表达式的值返回。var是简单的整型变量或者下标数组变量。这里需要检查下标值为非负但是不进行下标越界检查。提出这样的一种建议能够达成var ® ID的情况依据实际存在的状况去达成var ® ID。expression数组变量的识别。4. 组成一个简单表达式有这两种情况一种是简单表达式加上相加表达式再经关系操作符连接相加表达式另一种则仅仅是相加表达式。5. relop ® | |!6. additive-expression 呢可演变为 additive-expressionaddopterm 这般的形式或者简单说呢还能是 term。7. addop ® | -9. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。10. 将表达式参照变量按照数值进行因式分解。那些被围在括号内的表达式是因子或者是一个变量要去求出这个变量的值又或者是一个函数调用得求出函数的返回值再或者是一个NUM其值是由词法分析器来确定的。附2main()if (ab) ab else ac;可参考的文法如下0. program ® main(){if_stmt }1. if_stmt®若存在( expression )则有 statement 若存在( expression )则有 statement 不然就有 statement。表达条件的语句有着被大家所熟知的一般性语义那就是对表达式开展计算倘若计算结果并非0则意味着条件是真实的这会引发第一条语句的运行要是计算结果为0这表明条件是虚假的会引发第二条语句的运行如果存在第二条语句的话。此条规则存在典型的“dangling else”二义性情况这种二义性能够借助一种“最近嵌套”的原则予以解决。建议显示能够实现 if_stmt®此是 if ( expression ) statementelsestatement按照自身情形要是打算实现不带有 else 的语句。2. statement ® expression ; | ;3. 如下这般的表达形式即变量的值等于表达式或者是简单表达式。4. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。5. 单纯表达式®加法表达式关系运算符加法表达式 | 加法表达式其中单纯表达式®按加法表达式来关系运算符接加法表达式或者直接是加法表达式 每处表述都各有其特定规则及要求。6. relop ® | |!7. 加法表达式 ® 加法表达式加法运算符项 | 项其中加法表达式是一种运算表示加法运算符项是包含加法运算符的项项是一种运算单元。8. addop ® | -9. 术语®术语乘法运算符因子或因子因子术语®术语会乘法运算符因子因子。10. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。11. 因子®表达式 竖线|变量var数字NUM。因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个NUM其值由词法分析器确定。附3main()while (a!0) a321*a;可参考的文法如下0. program ® main(){while_stmt }1. 一个被称为while - stmt的语句它呈现为这样的形式即while表达式语句。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其值由词法分析器确定。附4三条语句的C语言文法0. 程序标志为®主函数括号内包含语句列表。表示句子结束。1. statement_list 能够推导出 statement_liststatement 或者推导出 ε。2. 声明“®”意思是表达式语句或者是条件语句又或者是循环语句。3. 表达式语句可由表达式分号构成或者仅由分号构成。表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结果。因此这个语句用于赋值和函数调用。4. “if_stmt®”这里有多种情况如果是“if ( expression ) statement”或者说又存在另一种情况是“if ( expression ) statementelsestatement”。条件语句有通常的语义对表达式进行计算非0值表示条件为真引起第一条语句的执行0值表示条件为假引起第二条语句的执行如果它存在的话。这条规则存在典型的“dangling else”二义性可以用一种“最近嵌套”原则解决二义性。建议可实现if_stmt® if ( expression ) statementelsestatement根据自身情况如果要实现不带else的语句。5. While语句也就是while(表达式)语句 其中的语句是statement 而表达式是expression。6. 将变量赋值为表达式或者是简表达式这里说的表达式为expression® 简表达式为simple-expression。7. var ® ID | IDexpression表达式是一个变量引用后面跟着赋值符号(等号)和一个表达式或者就是一个简单的表达式。赋值的语义为首先找到由变量var的地址然后对赋值符右边的子表达式进行求值再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负但不进行下标越界检查。建议可实现var ® ID根据实际情况实现var ® IDexpression数组变量的识别。8. 单独的简单表达式加上表达式通过关系运算符连接加上表达式或者另一个加上表达式这是一种情况还有一种情况是只有加上表达式。9. relop ® | |!10. 添加剂表达式接着是添加剂表达式之后是加法运算符再加上项或者就只是项。11. addop ® | -13. mulop ® * | /加法表达式和项表示了算术操作符的结合性和优先级。14. 使表达式进行因式分解以变量或数字作为系数进行相应操作 得到结果。因子是围在括号内的表达式或一个变量求出其变量的值或者一个函数调用求出函数的返回值或者一个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{重复重复重复重复重复重复重复重复10重复30100重复重复重复50重复重复重复重复重复10重复重复重复20重复60重复重复重复重复重复重复。int Sint distint pint i,j,u,min;for(i1;i0;distcostif(distMAX)0;else p1;1;for(i2;iminMAX;for(j1;j

更多文章