编译器前端工作台 —— 一个基于 Qt 的编译器前端可视化工具,完整实现从正则表达式/BNF 文法配置到词法分析器自动生成、语法分析与语义分析的全流程。
- 读取用户定义的正则表达式规则文件
- 正则表达式解析:词法解析 → 语法解析(AST)→ NFA(Thompson 构造法)→ DFA(子集构造法)→ 最小化 DFA
- 自动生成 C++ 词法分析器源代码并编译为可执行程序
- 可视化展示每个正则规则对应的 NFA / DFA / 最小化 DFA 状态转换表
- 读取用户定义的 BNF 文法文件
- 文法处理流水线:文法解析 → FIRST/FOLLOW 集计算 → LR(0) 自动机构造 → SLR(1) 冲突检测 → LR(1) 自动机构造 → LR(1) 分析表构造
- 基于 LR(1) 分析表对 Token 流进行语法分析
- 语义分析:符号表管理、四元组中间代码生成、回填(backpatch)技术
- 支持通过 JavaScript(QJSEngine)执行用户自定义语义动作
- 多标签页代码编辑器(支持行号、语法高亮)
- 项目文件树面板(QTreeView + QFileSystemModel)
- 中央控制台(错误日志 + 终端输出)
- 分析结果视图:AST 树形/图形展示、LR 分析步骤表、四元组列表
- 配置结果视图:FIRST/FOLLOW 集、LR(0)/LR(1) DFA 状态图、LR(1) 分析表
| 类别 | 技术 |
|---|---|
| 语言 | C++17 |
| GUI 框架 | Qt 6.5.3(Widgets + QML) |
| 构建系统 | qmake |
| 脚本引擎 | QJSEngine(语义动作执行) |
| 编译器 | MinGW 64-bit (GCC) / MSVC |
纯手写实现,无第三方依赖。 所有编译器前端算法(正则引擎、有限自动机、LR 分析)均为从零实现。
CompilerFrontWorkbench/
├── CompilerFrontWorkbench.pro # qmake 工程文件
├── main.cpp # 应用程序入口
├── mainwindow.h/.cpp/.ui # 主窗口
├── src/
│ ├── common/ # 公共基础设施
│ │ ├── graph/ # 自动机图结构(状态转移图)
│ │ └── utils/ # 位图(BitSet)、字符串工具、文件工具
│ ├── lexical/ # 词法分析模块
│ │ ├── core/ # 核心数据结构(Regex、LexicalConfig)
│ │ ├── regex/ # 流水线:词法解析→语法解析→NFA→DFA→最小化→代码生成→映射表
│ │ └── LexicalServicer # 词法分析服务编排
│ ├── syntax/ # 语法分析模块
│ │ ├── core/ # 核心数据结构(Grammar、SemanticAction、SyntaxConfig)
│ │ ├── grammar/ # 流水线:文法解析→FIRST/FOLLOW→LR0→SLR1→LR1→分析表
│ │ ├── semantic/ # 语义分析辅助(符号表、四元组、AST管理)
│ │ └── SyntaxServicer # 语法分析服务编排
│ └── ui/ # 用户界面模块
│ ├── template/ # 可复用组件(CodeEditor、TriangleButton)
│ ├── view/ # 结果展示视图
│ └── widget/ # 功能部件(ProjectPanel、EditorTab、Console、Config)
├── test/ # 单元测试
│ ├── LexicalModuleTester # 词法模块全流程测试
│ ├── SyntaxModuleTester # 语法模块全流程测试
│ └── UiModuleTester # UI 模块测试
└── sample/ # 示例语言
├── postfix expression/ # 后缀表达式示例(.regex + .bnf + 源代码)
└── tiny/ # TINY 语言示例(.regex + .bnf + 源代码)
- Qt 6.5.3 或更高版本(需包含 Widgets 和 QML 模块)
- 支持 C++17 的编译器(MinGW 8.1+ / MSVC 2019+ / GCC 8+)
- Qt Creator(推荐)或命令行 qmake
使用 Qt Creator:
- 打开
CompilerFrontWorkbench.pro文件 - 配置构建套件(MinGW 64-bit 或 MSVC)
- 点击构建并运行
使用命令行:
mkdir build && cd build
qmake ../CompilerFrontWorkbench.pro
make # 或 mingw32-make / nmake(Windows)项目包含三个测试模块,可在 main.cpp 中取消注释来运行:
// LexicalModuleTester::instance().testAll(); // 词法模块测试
// SyntaxModuleTester::instance().testAll(); // 语法模块测试
// UiModuleTester::instance().testAll(); // UI 模块测试-
配置编译环境:在菜单栏中打开配置对话框,分别指定:
- 正则表达式规则文件(
.regex),可选用sample/tiny/build/tiny.regex - BNF 文法文件(
.bnf),可选用sample/tiny/build/tiny.bnf - C++ 编译器路径(用于编译生成的词法分析器)
- 正则表达式规则文件(
-
构建:点击工具栏的构建按钮,系统将:
- 执行词法配置流水线,生成词法分析器程序
- 执行语法配置流水线,构造 LR(1) 分析表
-
分析:打开待分析的源代码文件(如
sample/tiny/longTest.tiny),点击分析按钮,系统将:- 调用生成的词法分析器将源代码转换为 Token 流
- 基于 LR(1) 分析表进行语法分析
- 执行语义动作,生成 AST 和四元组中间代码
-
查看结果:在结果视图中查看 AST 树、LR 分析步骤和四元组。
详细使用说明请参阅 使用说明书,示例语言文件位于
sample/目录下。
| 算法 | 说明 |
|---|---|
| Thompson 构造法 | 正则表达式 → NFA |
| 子集构造法 | NFA → DFA |
| Hopcroft 算法 | DFA 最小化 |
| FIRST/FOLLOW 集 | LL/LR 分析前置计算 |
| LR(0) 项目集规范族 | LR(0) 自动机构造 |
| LR(1) 项目集规范族 | LR(1) 自动机构造 |
| SLR(1) 冲突检测 | 判断文法是否为 SLR(1) |
| LR(1) 分析表 | Action 表 + Goto 表构造 |
| 回填(Backpatch) | 语义分析中的地址回填 |
本项目仅用于教学和学习目的。