# Syntax Parser
**《编译原理》课程设计,基于 LR (1) 分析的类 C 语言语法分析器**(本项目配套的 [词法分析器](https://github.com/LIU42/LexicalParser))
## 项目简介
本项目为基于 LR (1) 分析的类 C 语言语法分析器,可以实现针对一种类似 C 语言程序的 Token 序列(由 [词法分析器](https://github.com/LIU42/LexicalParser) 生成)进行语法分析,给出合法判断、出错位置及大致原因。
本项目提供的默认文法支持除了:
- 复杂的指针类型(如函数指针,行指针等)
- 关键字 typedef 及相关的类型定义
- 编译预处理指令
以外大部分的 C 语言语法规则。此外还有一些额外的关键字,详见 [词法分析器](https://github.com/LIU42/LexicalParser) 中的介绍。
## 实现方案
### 工作流程
整个项目的工作流程如下:
1. 首先读入文法配置文件(<u>configs/grammar.json</u>)中描述语法规则的带有拓广产生式的 2 型文法,并根据该文法利用项目集规范族法构造识别活前缀的有穷自动机(状态转换表)。
2. 其次根据状态转换表,判断项目类型,逐一添加 ACTION 表项和 GOTO 表项,分别构造 ACTION 表和 GOTO 表。
3. 最后根据 ACTION 表和 GOTO 表,以及错误信息配置文件(<u>configs/message.json</u>)利用 LR (1) 分析流程,对输入的 Token 序列进行语法分析和错误处理。
当检测到语法错误时,采用恐慌模式(Panic)错误恢复策略,即不断丢弃下一个 Token,直到找到一个能够进行正常分析的 Token 继续分析。
### 伪代码描述
伪代码仅表示程序的处理逻辑,与真正的实现不完全一致。
```
创建状态栈和符号栈;
while (指针未到达末尾 && 分析结束标志为假) {
根据指针位置取出待分析的 Token;
查询 ACTION 表获取该 Token 对应的操作;
if (无对应操作) {
ACTION 出错处理程序;
} else if (为接受操作) {
分析结束标志设为真;
} else if (为移进操作) {
当前 Token 压入符号栈;
对应 ACTION 表值压入状态栈;
指针后移一位;
} else if (为归约操作) {
从符号栈中弹出指定数量的符号进行归约,将归约后的符号重新压入栈中;
从状态栈中弹出相同数量的符号,之后用栈顶状态和归约后的符号查询 GOTO 表;
if (GOTO 表查询结果为空) {
GOTO 出错处理程序;
}
GOTO 表查询结果压入状态栈中;
}
}
```
## 使用说明
configs 目录下的 grammar.json 文件为本项目的文法配置文件,本项目提供一种默认的文法,也可根据需要调整其中内容,其结构如下:
```json5
{
"formulas": [
/*
* 语法规则文法产生式列表,要求 II 型文法
* 编写规则形如:"[SelectionStatement] -> <keywords,if> <bounds,(> [Expression] <bounds,)> [Statement]"
* 非终结符以[]包裹,名称可自定义
* 终结符按照 Token 的表示规则:<所属类型,内容>
* 不同的符号间以空格分隔
*/
]
}
```
configs 目录下的 message.json 文件为本项目的错误信息配置文件,用于根据出错的符号确定错误原因,本项目提供一组默认的配置,也可根据需要调整其中内容,其结构如下:
```json5
{
"messages": [
{
"token": /* 出错的 Token,表示规则为 <所属类型,内容> */,
"message": /* 对应的出错原因描述 */
}
// 类似地可添加多个规则
],
"defaults": // 默认的出错原因描述,在没有成功匹配时调用
}
```
本项目不依赖任何第三方库,由于文法产生式数量较多,构建 ACTION 表和 GOTO 表为一项耗时操作。运行 <u>tables/build.py</u> 文件即可根据配置的文法生成 ACTION 表和 GOTO 表并保存在本地:
- 生成的 ACTION 表和 GOTO 表位于 <u>examples/tables/</u> 目录下,执行生成任务前若该目录不存在请先创建,其中 action.txt 文件为 ACTION 表内容,goto.txt 文件为 GOTO 表内容。
- 生成报告位于 <u>examples/reports/</u> 目录下,执行生成任务前若该目录不存在请先创建,其中 items.txt 文件为生成的项目集,conflicts.txt 文件为表项冲突。
运行主程序 main.py 即可进行语法分析。本项目提供了一些测试用例,也可根据需要调整输入和输出文件路径。
没有合适的资源?快使用搜索试试~ 我知道了~
编译原理课程设计,Python基于 LR (1) 分析的类 C 语言语法分析器源代码+使用说明
共23个文件
py:11个
txt:8个
json:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 33 浏览量
2024-11-08
16:32:08
上传
评论
收藏 21KB ZIP 举报
温馨提示
本项目为基于 LR (1) 分析的类 C 语言语法分析器,可以实现针对一种类似 C 语言程序的 Token 序列(由 词法分析器 生成)进行语法分析,给出合法判断、出错位置及大致原因。 本项目提供的默认文法支持除了: 复杂的指针类型(如函数指针,行指针等) 关键字 typedef 及相关的类型定义 编译预处理指令 以外大部分的 C 语言语法规则
资源推荐
资源详情
资源评论
收起资源包目录
SyntaxParser-main.zip (23个子文件)
SyntaxParser-main
main.py 772B
configs
grammar.json 14KB
message.json 1KB
examples
sources
source3.txt 1KB
source4.txt 4KB
source2.txt 10KB
source1.txt 5KB
outputs
output2.txt 0B
output3.txt 58B
output1.txt 0B
output4.txt 317B
items
utils.py 2KB
__init__.py 75B
components.py 2KB
.gitignore 3KB
grammars
__init__.py 160B
loader.py 737B
elements.py 5KB
syntax.py 3KB
tables
__init__.py 128B
components.py 5KB
build.py 2KB
README.md 5KB
共 23 条
- 1
资源评论
yanglamei1962
- 粉丝: 2527
- 资源: 838
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AI复活历史人物快速涨粉10w+附:不花1分钱无限使用可灵方法
- 【java毕业设计】动画门户网源码(完整前后端+说明文档+LW).zip
- Windows系统渗透工具(Windows-infiltration-tool).zip
- C#美容美发会员管理系统源码带数据库文档数据库 SQL2008源码类型 WinForm
- 贪吃蛇游戏(C++/C#)
- web渗透测试平台在docker上的搭建.zip
- JDK 22.0.2 (64-bit) for Windows 11: 步骤详述与配置指导
- Web渗透学习笔记.zip
- 数据来源于Kaggle,文件名为 cwurData.csv -预测大学得分
- 【java毕业设计】大学生户外运动管理系统源码(完整前后端+说明文档+LW).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功