我是靠谱客的博主 酷酷大叔,最近开发中收集的这篇文章主要介绍【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)一、目标任务二、程序功能描述三、主要数据结构描述四、程序结构描述五、代码六、程序测试,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
本实验基于词法分析程序实现,可参考本人前面的文章。
目录
一、目标任务
二、程序功能描述
三、主要数据结构描述
四、程序结构描述
设计方法
First集和Follow集
递归子程序框图
函数定义及函数之间的调用关系
五、程序测试
测试用例1
测试结果1
测试用例2
测试结果2
测试用例3
测试结果3
测试用例4
测试结果4
一、目标任务
完成以下描述赋值语句的 LL(1)文法的递归下降分析程序
G[S]: S→V=E
E→TE′
E′→ATE′|ε
T→FT′T′→MFT′|ε
F→ (E)|i
A→+|-
M→*|/
V→i终结符号 i 为用户定义的简单变量,即标识符的定义。
二、程序功能描述
输入词法分析输出的二元式序列,能够输出该算术表达式是否为该文发定义的判断结果;
输出二元式序列对应的算术表达式;
输出算术表达式对应的单词符号类别编码;
输出递归下降语法分析的过程;
能够通过递归下降分析发现简单的语法错误。
三、主要数据结构描述
常量MAX_LENG定义数组的最大长度;
sign用于标记语句是否正确;
key[MAX_LENG]存放单词符号的编码类别;
buf[MAX_LENG]保存词法分析程序的二元式序列;
shuru[MAX_LENG]保存待检测的算术表达式;
len为buf的长度。
四、程序结构描述
设计方法
First集和Follow集
递归子程序框图
函数定义及函数之间的调用关系
S():调用V、E
E():调用E’
E’():调用A、T、E’
T():调用F、T’、
T’():调用M、F、T’
F():调用E
A()
M()
V()
五、代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENG 1024
int i;
int sign=0;//标记语句是否正确
int key[MAX_LENG];//存放单词符号的编码类别
void S();
void E();
void E_();
void T();
void T_();
void F();
void A();
void M();
void V();
void S(){
if(sign==0){
printf("S ");
if(key[i]==1){
V();
if(sign==0&&key[i]==31){
i++;
E();
}
else{
sign=1;
printf("nS处出现错误n");
}
}
else{
sign=1;
printf("nS处出现错误n");
}
}
}
void E(){
if(sign==0){
printf("->E ");
if(key[i]==23||key[i]==1){
T();
if(sign==0){
if(key[i]==16||key[i]==17){
E_();
}else if(key[i]==24||key[i]==-1){
return;
}else{
sign=1;
printf("nE处出现错误n");
}
}
}else{
sign=1;
printf("nE处出现错误n");
}
}
}
void E_(){
if(sign==0){
printf("->E' ");
if(key[i]==16||key[i]==17){
A();
if(sign==0){
if(key[i]==23||key[i]==1){
T();
if(sign==0){
if(key[i]==16||key[i]==17){
E_();
}else if(key[i]==24||key[i]==-1){
return;
}else{
sign=1;
printf("nE'处出现错误n");
}
}
}else{
sign=1;
printf("nE'处出现错误n");
}
}
}else if(key[i]==24||key[i]==-1){
return;
}else{
sign=1;
printf("nE'处出现错误n");
}
}
}
void T(){
if(sign==0){
printf("->T ");
if(key[i]==23||key[i]==1){
F();
if(sign==0){
if(key[i]==18||key[i]==19){
T_();
}else if(key[i]==16||key[i]==17||key[i]==24||key[i]==-1){
return;
}else{
sign=1;
printf("nT处出现错误n");
}
}
}else{
sign=1;
printf("nT处出现错误n");
}
}
}
void T_(){
if(sign==0){
printf("->T' ");
if(key[i]==18||key[i]==19){
M();
if(sign==0){
F();
if(sign==0){
T_();
}
}
}else if(key[i]==16||key[i]==17||key[i]==24||key[i]==-1){
return;
}else{
sign=1;
printf("nT'处出现错误n");
}
}
}
void F(){
if(sign==0){
printf("->F ");
if(key[i]==23){
i++;
if(key[i]==23||key[i]==1){
E();
if(sign==0){
if(key[i]==24){
i++;
}
else{
sign=1;
printf("nF处出现错误n");
}
}
}
else{
sign=1;
printf("nF处出现错误n");
}
}
else if(key[i]==1){
i++;
}
else{
sign=1;
printf("nF处出现错误n");
}
}
}
void A()
{
if(sign==0){
printf("->A ");
if(key[i]==16||key[i]==17){
i++;
}
else{
sign=1;
printf("nA处出现错误n");
}
}
}
void M()
{
if(sign==0){
printf("->M");
if(key[i]==18||key[i]==19){
i++;
}
else{
sign=1;
printf("nM处出现错误n");
}
}
}
void V()
{
if(sign==0){
printf("->V ");
if(key[i]==1){
i++;
}
else{
sign=1;
printf("nV处出现错误n");
}
}
}
int main(){
FILE *fp;
char buf[MAX_LENG]={0};//用于保存文件词法分析的结果
char shuru[MAX_LENG]={0};//shuru为待检测的语句
int len;//buf的长度
int k=0,x=0,j=0;
printf("词法分析二元式序列:n");
if((fp=fopen("demo_out.txt","r"))!=NULL){
while(fgets(buf,MAX_LENG,fp)!=NULL){//每次读取一行
len=strlen(buf);
buf[len]='