概述
一、实验目的
1.加深对递归下降分析法一种自顶向下的语法分析方法的理解。
2.根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器。
二、实验内容
根据课堂讲授的形式化算法,编制程序实现递归下降分析器,能对常见的语句进行分析。
三、实验要求
首先对上下文无关文法进行检查,消除左递归和左公共因子,从逻辑上检测避免死循环和低效率处理。 采用每个产生式的左边的文法符号对应一个函数或过程的形式,编写程序实现一个递归下降分析器。注意这里的语法分析,是在词法分析的基础上进行的。
要求实现以下语法的递归下降分析:
示例:
输入语句:
{
i=2;
while(i<=100)
{
sum=sum+i;
i=i+2;
}
}
推导过程:
四、算法分析
语法分析是编译程序的核心功能之一。语法分析的作用是识别有词法分析个哦出的单词符号串是否是给定文法的正确句子。递归下降分析属于自顶向下分析,即从文法的开始符号出发企图推到出与输入的单词符号串完全相匹配的句子。
这里的语法分析,是在词法分析的基础上进行的。输入示例内容,逐个读入单词,对其进行词法分析。采用每个产生式的左边的文法符号对应一个函数的形式,实现递归下降分析器。将最左推导的过程逐步完整输出,具体实现方式是将上一行的输出存储在一个字符串变量中,每次用产生式的右部替换字符串最左非终结符再输出。递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程。分析过程就是从文法开始符出发执行一组递归过程,这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。
代码:
#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<iostream>
using namespace std;
char prog[1000],ch,ch1,token[1000],filename[30];
int p=0,sym=0,n,line=1;
FILE *fpin;
const char *keyword[22]={"if","else","while","do","main","int","float","for"
"double","return","const","void","continue","break","char",
"signed","enum","long","switch","case","auto","unsigned"};
char keywordtable[20][20],digittable[20][20],otherchartable[20][20],idtable[20][20],notetable[20][20],finaltable[100][20];
//存放保留字、存放数字、其他字符、标识符、注释、终结符
int finaltableint[100];
char word[20];
void otherchar();
void note();
void program();
void block();
void stmts();
void stmt();
void expr();
void expr1();
void term();
void term1();
void factor();
int digit_num=0,keyword_num=0,otherchar_num=0,id_num=0,note_num=0;
int final_num=0,finalnum=0;
int flag_error=0; //0表示没有错误,1表示有错误
int flagerror=0;
void initialize() //初始化数组word
{
for(int i=0;i<20;i++)
{
word[i]='