当前位置: 首页 > news >正文

实验三 语法分析的C语言实现

实验三 语法分析的C语言实现

时间:2026.4.23

实验三语法分析的C语言实现

一、 实验目的

加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。

二、实验要求

1、 在实验一(用C语言实现词法分析的程序)的基础上,实现编写语法分析程序,语法分析程序的实现可以采用任何一种编程工具。

2、对语法规则有明确的定义;

3、编写的分析程序能够对实验一的结果进行正确的语法分析;

4、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;

三、实验指导1(实现算术表达式的运算)

(一)准备

1.阅读课本有关章节,参考P63的表6.3优先关系表。

2.初步编制程序。

3.准备一组测试数据。

(二)程序要求

1.程序输入/输出示例:

输入如下一段C语言源程序:

3+2*(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*(b+2);

if (a>b) a=b else a=c;

while (a!=0) a=3+21*a;

输出:依次输出所用到的文法规则或出错信息。

2. 建议:实验一的词法分析结果保存到文件input.c,实验二直接从input.c读取一个token,将用到的文法规则输出并保存到文件output.c。(注:ID和NUM由词法分析器返回)

3.可选功能:可以根据自身的情况完善语法分析程序的错误处理功能,如对遇到的语法错误给出准确的位置和错误类型提示。

三、实验指导3(用分析表实现语法分析)

(一)准备

1.阅读课本有关章节,参考P52-P53的LL(1)分析法的实现或者P63-P65的算符优先文法的实现,明确语言的语法。

2.初步编制程序。

3.准备一组测试数据。

(二)程序要求

1.程序输入/输出示例:

输入如下一段C语言源程序(实现赋值语句或者if语句或者while语句,或者都实现):

main()

a = 10*(b+2);

if (a>b) a=b else a=c;

while (a!=0) a=3+21*a;

输出:依次输出所用到的文法规则或出错信息。

2. 建议:实验一的词法分析结果保存到文件input.c,实验二直接从input.c读取一个token,将用到的文法规则输出并保存到文件output.c。(注:ID和NUM由词法分析器返回)

3.可选功能:可以根据自身的情况完善语法分析程序的错误处理功能,如对遇到的语法错误给出准确的位置和错误类型提示。

四、实验报告

1. 实验目的

2. 实验分工

3. 程序说明:实现的文法说明、主要函数介绍

4. 其他说明:包括可选功能的实现介绍、编程中遇到的主要问题、可改进的地方

5. 运行结果截图显示

6. 源程序:要求有一定的注释

附1:main()

a = 10*(b+2);

可参考的文法如下:

0. program ® main(){expression_stmt }

1. expression_stmt ® expression ; | ;

表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结果。因此,这个语句用于赋值和函数调用。

2. expression® var=expression | simple-expression

3. var ® ID | ID

expression

表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。

建议:可实现var ® ID;根据实际情况实现var ® ID

expression

数组变量的识别。

4. simple-expression ® additive-expressionrelopadditive-expression | additive-expression

5. relop ® = | == |!=

6. additive-expression ® additive-expressionaddopterm | term

7. addop ® + | -

8. term ® termmulopfactor | factor

9. mulop ® * | /

加法表达式和项表示了算术操作符的结合性和优先级。

10. factor ® ( expression) | var | NUM

因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。

附2:main()

if (a>b) a=b else a=c;

可参考的文法如下:

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® var=expression | simple-expression

4. var ® ID | ID

expression

表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。

建议:可实现var ® ID;根据实际情况实现var ® ID

expression

数组变量的识别。

5. simple-expression ® additive-expressionrelopadditive-expression | additive-expression

6. relop ® = | == |!=

7. additive-expression ® additive-expressionaddopterm | term

8. addop ® + | -

9. term ® termmulopfactor | factor

10. mulop ® * | /

加法表达式和项表示了算术操作符的结合性和优先级。

11. factor ® ( expression) | var | NUM

因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。

附3:main()

while (a!=0) a=3+21*a;

可参考的文法如下:

0. program ® main(){while_stmt }

1. while-stmt® while(expression)statement

2. statement ® expression ; | ;

3. expression® var=expression | simple-expression

4. var ® ID | ID

expression

表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。

建议:可实现var ® ID;根据实际情况实现var ® ID

expression

数组变量的识别。

5. simple-expression ® additive-expressionrelopadditive-expression | additive-expression

6. relop ® = | == |!=

7. additive-expression ® additive-expressionaddopterm | term

8. addop ® + | -

9. term ® termmulopfactor | factor

10. 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_stmt

3. 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)statement

6. expression® var=expression | simple-expression

7. var ® ID | ID

expression

表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。

建议:可实现var ® ID;根据实际情况实现var ® ID

expression

数组变量的识别。

8. simple-expression ® additive-expressionrelopadditive-expression | additive-expression

9. relop ® = | == |!=

10. additive-expression ® additive-expressionaddopterm | term

11. addop ® + | -

12. term ® termmulopfactor | factor

13. mulop ® * | /

加法表达式和项表示了算术操作符的结合性和优先级。

14. factor ® ( expression) | var | NUM

因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。

第二篇:dijkstra算法的C语言实现

#include "stdafx.h"

#include "stdio.h"

#include

#define N 6

#define MAX 9999

void Path(int *p,int v,int i)

int que

int t=v;

que

t++

=i;

int tmp=p

while(tmp!=v)

que

=tmp;

t++;

tmp=p

tmp

que

=v;

for(int k=t;k>=1;--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 S

int dist

int p

int i,j,u,min;

for(i=1;i

=0;

dist

=cost

if(dist

==MAX)

=0;

else p

=1;

=1;

for(i=2;i

min=MAX;

for(j=1;j

if(!S

&&dist

u=j;

min=dist

=1;

for(j=1;j

if(!S

&&min+cost

dist

= min+cost

=u;

for(i=2;i

printf("the shortest line 1--->%d:%d",i,dist

);printf("顶点遍历:");

Path(p,1,i);

system("pause");

http://www.jsqmd.com/news/678083/

相关文章:

  • 实测性能反超15%!C#工业上位机统信UOS+鲲鹏全栈移植指南(踩坑+优化+源码)
  • 注意力不足是什么?主要有那些多动症的症状表现?
  • 2026年4月成都汽车保管服务哪家靠谱?3家机构客观对比 - 优质品牌商家
  • 从零搭建AI量化交易系统:2026年完整入门教程
  • 别再死磕毕业论文!PaperXie 一键打通 “选题 - 定稿” 全流程,效率翻倍
  • 哔哩下载姬:3步轻松搞定B站视频高效下载与智能管理
  • 5分钟彻底解决Windows驱动臃肿:DriverStore Explorer终极清理指南
  • 四川岩棉板技术全解析:性能指标与场景选型指南 - 优质品牌商家
  • 转行网络安全:非科班出身如何准备面试?
  • wxWidgets实战指南:从入门到精通的核心模块与项目构建
  • 终极视频号批量下载指南:从3小时到3分钟的完整解决方案
  • 毕业论文通关秘籍:PaperXie 手把手带你从选题躺赢到定稿
  • 从本地开发到团队协作:用CLion + Gitee管理你的C++库项目(含CMakeLists模板)
  • 靓雅高级奢华化妆品GII极妒品牌包装设计 - 宏洛图品牌设计
  • redis-cli MODULE LIST的庖丁解牛
  • 如何高效获取城通网盘直连下载地址:技术原理与实用指南
  • RK3588s Android12 HDMI显示调试:从开机Logo到系统界面的完整避坑指南
  • 告别安装报错:手把手解决Checkmarx 9.5安装过程中的‘必要条件检查失败’与许可证激活问题
  • 3个步骤解锁Windows效率神器:PowerToys中文版完全使用指南
  • 开源已死?许可证变更潮下的35个应对方案——软件测试从业者生存指南
  • Real DOM 和 Virtual DOM 的区别?优缺点?
  • 泛微E9二次开发实战:从环境搭建到核心接口的避坑指南
  • 别再被‘LD_PRELOAD cannot be preloaded‘刷屏了!Ubuntu/Debian下apt update报错的终极解法
  • Blender 4.0 新手避坑指南:从安装到第一个立方体,辣椒酱教程没讲的10个细节
  • 2026年3月华东手套箱供应商,恒温手套箱/厌氧手套箱/单工位手套箱/循环手套箱/真空手套箱,手套箱直销厂家哪家可靠 - 品牌推荐师
  • 植物表型平台/扫描平台/分析系统/测量系统/设备厂家推荐:温室、实验室、高通量设备品牌对比 - 品牌推荐大师1
  • Go语言怎么做DNS查询_Go语言DNS域名解析教程【完整】
  • 从一组差异基因到SCI图表:Python自动化绘制富集分析气泡图/柱状图实战
  • ArcGIS 10.2 安装避坑全记录:从.NET报错到License Manager配置(Win10/11实测)
  • WarcraftHelper终极指南:三步解锁魔兽争霸3 300帧率与宽屏体验