Yapp - 基于MATLAB的LL(1)解析器生成器
项目介绍
Yapp是一个专为MATLAB环境设计的轻量级LL(1)语法解析器生成器。该项目采用面向对象编程范式,实现了从语法规则定义到可执行解析器的完整生成流程。通过解析BNF格式的语法规则文件,Yapp能够自动构建LL(1)分析表,生成对应的MATLAB解析器代码,并提供强大的语法错误检测和容错处理能力。
功能特性
- 语法规则解析: 支持标准BNF格式的语法规则文件解析,自动识别终结符、非终结符和产生式规则
- LL(1)分析表构建: 自动计算First集、Follow集,构建完整的LL(1)分析表并检测语法冲突
- 代码生成: 生成可直接调用的MATLAB解析器类文件(.m文件)
- 错误处理: 提供详细的语法错误检测、定位和恢复机制
- 令牌化处理: 基于正则表达式的输入流令牌化分析
- 分析报告: 生成包含语法诊断信息、可视化依赖关系图和分析过程追踪的完整报告
使用方法
1. 定义语法规则文件(.yapp)
创建BNF格式的语法规则文件,定义文法规则:
%terminals PLUS, MINUS, MULT, DIV, NUMBER, LPAREN, RPAREN
%nonterminums expression, term, factor
expression ::= term (PLUS term | MINUS term)*
term ::= factor (MULT factor | DIV factor)*
factor ::= NUMBER | LPAREN expression RPAREN
2. 配置令牌定义
指定词汇单元的正则表达式模式:
token_patterns = {
'PLUS', '+';
'MINUS', '-';
'MULT', '*';
'DIV', '/';
'NUMBER', '[0-9]+';
'LPAREN', '(';
'RPAREN', ')';
};
3. 生成并调用解析器
% 生成解析器
parser = yapp_generate('grammar.yapp', token_patterns);
% 解析输入文本
result = parser.parse('1 + 2 * (3 - 4)');
% 查看解析结果
disp(result.syntax_tree);
disp(result.error_info);
系统要求
- MATLAB R2018b或更高版本
- 支持的工具箱:无特殊要求(纯MATLAB实现)
文件说明
主程序文件整合了语法规则解析、分析表构建、冲突检测、代码生成等核心功能,实现了从语法规则文件读取到最终解析器生成的完整工作流程。该文件负责协调各个处理模块,包括词汇分析、语法分析算法执行、First/Follow集计算、LL(1)分析表生成以及MATLAB代码输出,同时提供语法检查错误报告和可视化分析功能。