我是靠谱客的博主 要减肥短靴,最近开发中收集的这篇文章主要介绍【编译原理】实验二 递归下降分析程序设计(C语言、Python、Flex&Bison实现),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、实验目的
通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:
(1) 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
(2) 掌握语法分析的实现方法。
(3) 上机调试编出的语法分析程序。
二、实验内容与设计思想
完成以下描述算术表达式的LL(1)文法的递归下降分析程序构造
G[E]:
E → TE′
E′→ +TE′|ε
T → FT′
T′→ *FT′|ε
F → (E) | i
说明:终结符号i为用户定义的简单变量,即标识符的定义。
要求具有如下功能:
1)从文件读入算术表达式/或者从终端输入
2)总控函数分析算术表达式;
3)根据分析结果正误,分别给出不同信息
三、源代码
1、C语言
lab2.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
char str[30]; //字符串数组
int subscript = 0; //str数组的下标
int len; //数组长度
int tnum; //测试次数
FILE *fp = NULL; //声明文件
//1、处理非终结符E的子程序
void processE();
//2、处理非终结符E_e(即E')的子程序,e即英文extend
void processE_e();
//3、处理非终结符T的子程序
void processT();
//4、处理非终结符T_e的子程序
void processT_e();
//5、处理非终结符F的子程序
void processF();
//6、从文件读入算术表达式
void readFromFile(FILE *fp);
//7、从终端输入算数表达式
void enterFromTerminal();
lab2.c
#include "lab2.h"
//1、处理非终结符E的子程序,E->TE'
void processE(){
processT();
processE_e();
}
//2、处理非终结符E_e(即E')的子程序,E'->+TE'|ε
void processE_e(){
if(str[subscript] == '+'){
subscript ++;
processT();
processE_e();
}
}
//3、处理非终结符T的子程序,T->FT'
void processT(){
processF();
processT_e();
}
//4、处理非终结符T_e的子程序,T'->*FT'|ε
void processT_e(){
if(str[subscript] == '*'){
subscript ++;
processF();
processT_e();
}
}
//5、处理非终结符F的子程序,F->(E)|i
void processF(){
if(str[subscript] == 'i')
subscript ++;
//printf("Successfully!n");
else if(str[subscript] == '('){
subscript ++;
processE();
if(str[subscript] == ')')
subscript ++;
else{
printf("The string is illegal.Error!");
exit(0);
}
}
else{
printf("The string is illegal.Error!");
exit(0);
}
}
//6、从文件读入算术表达式
void readFromFile(FILE *fp){
while(fgets(str, 100, fp) != NULL){
printf("Read line = %s",str);
processE();
printf("Analyze successfully!n");
subscript = 0; //下标继续从0开始
}
printf("—————End of reading file—————n");
}
//7、从终端输入算数表达式
void enterFromTerminal(){
printf("Please enter the number of strings you want to parse:");
scanf("%d",&tnum);
while(tnum--){
printf("Please enter a string:n");
scanf("%s",str);
len = strlen(str);
//printf("%d",len);
//str[len+1] = '