LR(1)分析法实现与C++源代码解析
"这篇实验报告关注的是编译原理中的LR(1)分析法,通过C++实现。报告中包含了LR(1)分析器的关键数据结构和部分源代码,如Generate、Action、GOTO等结构体定义,以及状态栈的状态表示。" 在编译原理中,LR(1)分析法是一种自底向上的语法分析方法,用于解析程序的词法单元流,将这些单元转化为抽象语法树。LR(1)分析器的主要特点是它在进行分析决策时会考虑当前输入符号的下一个符号的信息,即“1”代表了向前看一个符号。 LR(1)分析器的工作基于以下关键组件: 1. **状态**:LR(1)分析器的状态是分析过程的记录,表示当前解析到的句型部分。在提供的代码中,`SIZE` 定义了状态集合的大小。 2. **ACTION表**:此表定义了在遇到终结符时分析器应采取的动作,例如 shift(移动到下一个状态)或 reduce(根据产生式收缩语法树)。在代码中,`Action` 结构体存储了每个状态下的shift和reduce信息。 3. **GOTO表**:当遇到非终结符时,GOTO表指示分析器应转移到哪个新状态继续解析。`GOTO` 结构体包含非终结符和对应的状态转移信息。 4. **Generate表达式**:在代码中用`Generate`结构体表示,它存储了文法的产生式,如左部和右部。 5. **状态栈**:在解析过程中,LR(1)分析器使用状态栈来保存分析状态。`status`数组就是状态栈,`sta_Index`表示栈顶索引。 6. **符号表**:虽然在提供的代码片段中没有直接提及,但在实际LR(1)分析器中,符号表用于存储词法单元,包括终结符和非终结符。 LR(1)分析法的基本步骤包括: - **初始化**:创建一个初始状态,通常称为S0,然后将初始符号(通常是开始符号)压入状态栈。 - **输入扫描**:逐个读取输入的词法单元。 - **分析**:对于每个输入符号,查询ACTION表以决定是shift(将该符号压入栈并转移到新的状态)还是reduce(根据匹配的产生式收缩栈顶若干符号,并转移到ACTION表指示的新状态)。 - **结束**:当输入结束且栈顶状态对应文法的结束符号时,分析成功。 在实际的C++实现中,还需要处理错误情况,如输入符号无法匹配任何ACTION表项,或者栈为空但仍有输入未处理。此外,LR(1)分析器的构造通常涉及LALR(1)算法,通过合并相似状态来减少状态数量,简化分析表。 总结来说,本实验报告的LR(1)分析器使用C++实现了数据结构和算法,用于解析符合特定上下文无关文法的输入序列。LR(1)方法结合了当前状态和下一个输入符号的信息,提供了一种有效的语法分析策略。
#include "string.h"
#include "stdlib.h"
//----------------------Global Declarition---------------------------------
#define SIZE 20
#define sSIZE 12 //There are sSIZE status
#define aSIZE 6 //There will ecounter aSIZE symbol
#define gSIZE 3 //May be goto next gSIZE status
#define geSIZE 6 //There are geSIZE generate expression
#define MAXSIZE 3
//---------------------Finish defining struct-------------------------------------
typedef struct Ge
{
char head; //Leftpart of Generate Expression
char gen[4]; //Rightpart of Generate Expression
}Generate;//--------------------------------Generate Expression base datastruct
typedef struct A
{
int st[aSIZE]; //aSIZE status when encountering terminated symbol
int re[aSIZE]; //Using reduce
}Action;//----------------------------------Action table base datastruct
typedef struct G
{
char head[gSIZE]; //Nonterminated symbol :'E' 'F' 'T'..etc
int gt[gSIZE]; //Mark the next status
}GOTO;//------------------------------------GOTO table base datastruct
int status[SIZE]; //stack of status
int sta_Index; //top of stack of status
char symbol[SIZE]; //stack of symbol
char expression[SIZE]; //Inputed expression
int exp_Index; //index of inputed expression
int exp_top; //top of expression that inputed
int step; //accumulated steps
int IsAccept = 0; //Initlize accept flag to 0
Generate gene[geSIZE +1];
Action act[sSIZE];
GOTO go[sSIZE];
//------------------------------------------------------------------------
void GOTOTable(int sta, char symb);
/*******************************************
*@Name: Syntax
*@Description: Printing Syntax
*@Param: void
*@Return: void
********************************************/
void Syntax(void)
{
printf("-------LR(1) Analysis Program -------- \n");
printf("*@Author: oDon 200490513101 WJ-0411\n");
printf("*@Create: 2006-12-7\n");
printf("*@Copyright: yuanonline@hotmail.com\n");
printf("*@Corporation: xxxx.CO.TD\n");
printf("*@Description: LR(1) Syntax Analysister\n");
printf("--------------------------------------\n\n");
printf("-------------LR(1) Syntax---------------\n");
printf(" (0)E -> E + T\n (1)E -> T\n (2)T -> T*F\n (3)T -> F\n (4)F -> E\n (5)F -> (i)\n");
printf("-----------------------------------------\n");
}
剩余12页未读,继续阅读
- 粉丝: 8
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 彩虹rain bow point鼠标指针压缩包使用指南
- C#开发的C++作业自动批改系统
- Java实战项目:城市公交查询系统及部署教程
- 深入掌握Spring Boot基础技巧与实践
- 基于SSM+Mysql的校园通讯录信息管理系统毕业设计源码
- 精选简历模板分享:简约大气,适用于应届生与在校生
- 个性化Windows桌面:自制图标大全指南
- 51单片机超声波测距项目源码解析
- 掌握SpringBoot实战:深度学习笔记解析
- 掌握Java基础语法的关键知识点
- SSM+mysql邮件管理系统毕业设计源码免费下载
- wkhtmltox下载困难?找到正确的安装包攻略
- Python全栈开发项目资源包 - 功能复刻与开发支持
- 即时消息分发系统架构设计:以tio为基础
- 基于SSM框架和MySQL的在线书城项目源码
- 认知OFDM技术在802.11标准中的项目实践