实验三 语法分析的C语言实现
时间:2026.4.14
实验三语法分析的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. 以下是改写后的:程序,标记为“主函数”,其包含表达式语句、。
1. 表达式语句可表示为,表达式加上分号 ,或者仅仅是分号。
有一种表达式语句,它存在一个可选的表达式,该表达式之后跟着分号。就这般的表达式来说,通常会求出它们其中一方的结果。由此可见,这个语句是被用于进行赋值操作以及函数调用的。
2. “expression®”,其中“var”等于“expression”,或者是“simple-expression”。
3. var ® ID | ID
expression
那表达式,它是这样的,是一个变量引用,接着跟着赋值符号,也就是等号,再然后跟着一个表达式,或者,它就是一个简单的表达式。赋值的语义是这样的,首先,要找到由变量var的地址,接着,对赋值符右边的子表达式进行求值,然后,把这个子表达式的值存储到给定的地址当中。这个值,也作为整个表达式的值返回。var是简单的整型变量或者下标数组变量。这里需要检查下标值为非负,但是不进行下标越界检查。
提出这样的一种建议,能够达成var ® ID的情况,依据实际存在的状况去达成var ® ID。
expression
数组变量的识别。
4. 组成一个简单表达式有这两种情况,一种是简单表达式加上相加表达式,再经关系操作符连接相加表达式,另一种则仅仅是相加表达式。
5. relop ® = | == |!=
6. additive-expression 呢,可演变为 additive-expressionaddopterm 这般的形式,或者简单说呢,还能是 term。
7. addop ® + | -
9. mulop ® * | /
加法表达式和项表示了算术操作符的结合性和优先级。
10. 将(表达式),参照变量,按照数值进行因式分解。
那些被围在括号内的表达式,是因子;或者是一个变量,要去求出这个变量的值;又或者是一个函数调用,得求出函数的返回值;再或者是一个NUM,其值是由词法分析器来确定的。
附2:main()
if (a>b) a=b else a=c;
可参考的文法如下:
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 | ID
expression
表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。
建议:可实现var ® ID;根据实际情况实现var ® ID
expression
数组变量的识别。
5. 单纯表达式®加法表达式关系运算符加法表达式 | 加法表达式,其中单纯表达式®按加法表达式来,关系运算符接加法表达式,或者直接是加法表达式 ,每处表述都各有其特定规则及要求。
6. relop ® = | == |!=
7. 加法表达式 ® 加法表达式加法运算符项 | 项,其中加法表达式是一种运算表示,加法运算符项是包含加法运算符的项,项是一种运算单元。
8. addop ® + | -
9. 术语®术语乘法运算符因子或因子,因子,术语®术语会乘法运算符因子,因子。
10. mulop ® * | /
加法表达式和项表示了算术操作符的结合性和优先级。
11. 因子(®)(表达式), 竖线(|),变量(var),数字(NUM)。
因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。
附3:main()
while (a!=0) a=3+21*a;
可参考的文法如下:
0. program ® main(){while_stmt }
1. 一个被称为while - stmt的语句,它呈现为这样的形式,即while(表达式)语句。
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. 程序,标志为®,主函数,括号内包含语句列表。表示句子结束。
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 | ID
expression
表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。
建议:可实现var ® ID;根据实际情况实现var ® ID
expression
数组变量的识别。
8. 单独的简单表达式,加上表达式,通过关系运算符连接加上表达式或者另一个加上表达式,这是一种情况,还有一种情况是只有加上表达式。
9. relop ® = | == |!=
10. 添加剂表达式,接着是添加剂表达式,之后是加法运算符再加上项,或者就只是项。
11. addop ® + | -
13. mulop ® * | /
加法表达式和项表示了算术操作符的结合性和优先级。
14. 使(表达式)进行因式分解,以变量或数字作为系数,进行相应操作 ,得到结果。
因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个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
={
重复,重复,重复,重复,重复,重复,重复,重复,10,重复,30,100,重复,重复,重复,50,重复,重复,重复,重复,重复,10,重复,重复,重复,20,重复,60,重复,重复,重复,重复,重复,重复。
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