1.1 编译对象
基本可以实现 C 语言全集作为编译对象。在 c99.l 中删除了少许不常用的词法定义
(如 f 后标、LL 后标、<:符号),重写了一些不够严谨的正则表达式(如将字符串字面
量重写为\"[^"\n]*\"),其余部分基本没有删改。
具体请参考 example/Simplified/c99_test.l。
1.2 编译功能
项目整体功能包括:
- .l 文件的解析,主要在 LexParser.ts 中完成;
- 正则表达式向加点、后缀形式的转换,主要在 Regex.ts 中完成;
- 由正则表达式构造 NFA,主要在 NFA.ts 中完成;
- 由 NFA 构造 DFA、DFA 最小化,主要在 DFA.ts 中完成;
- 词法分析器 C 代码的生成,主要在 CodeGenerator.ts 中完成。
项目还有一些特色功能,如自动机的可视化、C 代码的美化、C 代码的自动编译等。
- 广泛使用面向对象编程,使代码结构清晰,各部分独立,之间易于相互调用
- 完整支持正则表达式五大元符号:? + * | .(0 或 1 次,1 次或以上,0 次或以上,
或,任意字符)
- 正则定义部分可以使用或符|,让多条正则共享动作代码
- 支持正则表达式范围与范围补(ASCII 为全集):[A-Za-z0-9_]、[^"]
- 支持正则别名定义
- 可以使用范围型转义字符\d([0-9])和\s([ \t\r\n])
- 可在用户程序段重定向 yyout 输出流,默认为 stdout
- 支持 yylineno 获取行号、yyleng 获取词法单元长度、yytext 获取当前匹配字符串
- 支持 yyless 回退词法单元、yymore 补进词法单元
- 支持 yywrap 多输入文件连续处理、ECHO 输出 yytext
- 实现了最长匹配原则
- 正则表达式加点采用“隐式”加点处理,不向正则中插入任何字符,避免冲突
- 正则表达式中的“任意字符”(.)在自动机中不会展开为字符全集,而是采用巧
妙的 ANY 边和 OTHER 边来表示,极大简化了状态
- 提供了增强功能:自动机可视化、自动调用 GCC 编译生成的 C 代码、美化最终
生成的 C 代码、C 的字符串操作库
- 大量使用 assert 断言,程序具备一定的错误处理能力
评论0