本项目为 “解释器构造实践” 课程作业。
项目成员: 任思远,黎冠延,刘瑞康,朱申。
- 调用
Mini_C::preprocess::preprocess(filename)
进行预处理,扫描并替换宏,输出一个新的文件,用于后续的词法分析 - 调用
Mini_C::lexer::Lexer lexer; lexer.tokenize(const char* filename)
扫描文件(使用lexer.print()
输出 token 信息) - 调用
Mini_C::LR1::analyze(lexer);
进行 LR1 分析,并在规约时进行相应的语义动作 - AST
doc 中的 rule_origin.tsl 是文法产生式的原版文件,作为 RulesTranslator 的输入,输出是2个文件:
lr1.hpp
(直接用于 Mini_C 项目)rule.lr1
(展现了 LR1 的DFA)
doc 中的 rule_for_print_syntax_tree.tsl 用于画出文法树(只用来展示,不用于分析),输出的文件使用 graphiz 运行即可。
原作者:黎冠延,ssyram/RulesTranslator
目前项目中使用的是我稍作修改的版本(主要加了日志,修改了DFA遍历顺序)
有几个 path 我写死了:
- WholeTest.cpp
"rule.tsl"
(文法产生式输入文件)"lr1.hpp"
(输出的 hpp 文件,直接用于 Mini_C 项目)
- TableGenerator.cpp 中
"rule.lr1"
,输出 LR1 的 DFA- 如果文法中有 “移进规约冲突”,默认选择移进,并且最后所有的选择信息输出在
"Collision choose list: x entries"
- 如果有 “规约规约冲突”,那么立即结束,最后输出
"Collision occurs"
和规约的产生式编号
- 如果文法中有 “移进规约冲突”,默认选择移进,并且最后所有的选择信息输出在