资源简介

一:实验内容: 编写语法分析程序,实现对算术表达式的语法分析,要求所分析的算术表达式由如下的文法产生。 ◆E->E+T|E-T|T ◆T->T*F|T/F|F ◆F->id|(E)|num 二:实验要求: 在对表达式进行分析的同时,输出所采用的产生式。 可以采用多种方法 ◆编写递归调用程序,实现自顶向下的分析。 ◆编写LL(1)语法分析程序,要求: ◇编程实现算法4.2,为给定的文法自动构造预测分析表 ◇编程实现算法4.1,构造LL(1)预测分析程序, ◆编写语法分析程序,实现自底向上的分析,要求: ◇构造识别所有活前缀的DFA ◇构造LR分析表 ◇编程实现算法4.3,构造LR分析程序 ◆利用yacc自动生成语法分析程序,调用LEX自动生成的词法分析器程序

资源截图

代码片段和文件信息

#include 
#include 
#include 
#define PRO_NUM 11  //产生式个数 
#define PRO_MAXLEN 8  //产生式最大长度 
#define TER_NUM 9  //终结符个数 
#define UNTER_NUM 5  //非终结符个数
#define F_MAXLEN 8  //FIRST集和FOLLOW集的大小 
#define STR_MAXLEN 50  //待分析的输入表达式的最大长度 
#define IDNUM_MAXLEN 10  //待分析的输入表达式中id和num的的最大长度 
#define ERROR -1  //分析表项为空白,错误入口 
#define SYNCH -2  //分析表项为同步信息synch,同步错误入口 
#define ID 1  //字母标记 
#define NUM 2  //数字标记
#define OTHER 0  //其他字符标记 
#define TRUE 1
#define FALSE 0
#define NOTFOUND -1

typedef int Status;  //返回状态类型 

using namespace std;

char grammar[PRO_NUM][PRO_MAXLEN];  //文法表 
char ter_symbol[TER_NUM];  //终结符表 
char unter_symbol[UNTER_NUM];  //非终结符表 
char FIRST[UNTER_NUM][F_MAXLEN];  //FIRST集
char FOLLOW[UNTER_NUM][F_MAXLEN];  //FOLLOW集
int M[UNTER_NUM][TER_NUM];  //LL(1)语法预测分析表
char str[STR_MAXLEN+1];  //输入缓冲区

deque s;

//构成LL(1)分析器基本函数 
void Initial (void);  //初始化
void Create_Analysis (void);  //构造LL(1)语法预测分析表 
void GetString (void);  //获取待分析输入表达式                
void Analyse_Output (void);  //使用LL(1)语法预测分析表分析输入的表达式并输出分析结果

//LL(1)分析器辅助函数 
int GetStrLen (void);  //获取输入表达式的长度 
Status Judge_Ter (char ch);  //判断字符ch是否为终结符 
Status Judge_Unter (char ch);  //判断字符ch是否为非终结符
int Get_Ter_Num (char ch);  //返回终结符ch在终结符表中的下标 
int Get_Unter_Num (char ch);  //返回非终结符ch在终结符表中的下标 
Status In_FIRST (char A char ch);  //判断终结符ch是否在非终结符A的FIRST集中
Status In_FOLLOW (char A char ch);  //判断终结符ch是否在一个非终结符A的FOLLOW集中
void Output_Pro (int i);  //打印分析过程中输出的产生式
void Output_Stack (void);  //打印当前栈中的符号
void Output_Buffer (int ip);  //打印当前输入缓冲区中的符号串
Status Judge_Id (char ch);  //判断字符ch是否为构成id的字母
Status Judge_Num (char ch);  //判断字符ch是否为构成num的数字
Status Judge_Exceed (void);  //判断输入表达式中代表id和num的子串是否超过最大长度

int main ()

    Initial();  //初始化 
    Create_Analysis();  //构造LL(1)语法预测分析表 
    GetString();  //获取待分析输入表达式 
    Analyse_Output ();  //使用LL(1)语法预测分析表分析输入的表达式并输出分析结果
system(“pause“);
    return 0;
}

void Initial (void)  //初始化
{
    int i j;   
    s.push_back(‘$‘);
    s.push_back(‘E‘);  //初始化栈:构造空栈,并压入‘$‘与‘E‘ 

    //设置文法表,存储P代表E‘,Q代表T‘,e代表εi代表id,n代表num 
    strcpy (grammar[0] “E#TP#“);  //E →TE‘
    strcpy (grammar[1] “P#+TP#“);  //E‘ →+TE‘
    strcpy (grammar[2] “P#-TP#“);  //E‘ →-TE‘
    strcpy (grammar[3] “P#e#“);  //E‘ →ε
    strcpy (grammar[4] “T#FQ#“);  //T →FT‘
    strcpy (grammar[5] “Q#*FQ#“);  //T‘ →*FT‘
    strcpy (grammar[6] “Q#/FQ#“);  //T‘ →/FT‘ 
    strcpy (grammar[7] “Q#e#“);  //T‘ →ε
    strcpy (grammar[8] “F#i#“);  //F →id
    strcpy (grammar[9] “F#(E)#“);  //F →(E)
    strcpy (grammar[10] “F#n#“);  //F →num
    
    for (i = 0; i < UNTER_NUM; i++)  //LL(1)语法预测分析表初始化:所有表项置为错误ERROR
        for (j = 0; j < TER_NUM; j++)
            M[i][j] = ERROR;   
    strcpy (ter_symbol “+-*/()in$“);  //初始化终结符表  
    strcpy (unter_symbol “EPTQF“);  //初始化非终结符表   
    
    //初始化FIRST集
    strcpy (FIRST[0] “(in#“);
    strcpy (FIRST[1] “+-e#“)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      15166  2012-12-28 19:16  语法分析程序的设计与实现\语法分析器方法2.cpp

     文件      11588  2012-12-28 21:11  语法分析程序的设计与实现\语法分析器方法3.cpp

     文件      26908  2013-01-15 13:03  语法分析程序的设计与实现\语法分析实验报告.docx

     文件     680042  2012-12-26 22:33  语法分析程序的设计与实现\语法分析程序的设计与实现.pdf

     目录          0  2013-01-15 13:06  语法分析程序的设计与实现

----------- ---------  ---------- -----  ----

               733704                    5


评论

共有 条评论