# Tiny扩充语言的语法树生成 **Repository Path**: RaidenLumine/tiny-expression-syntax-tree ## Basic Information - **Project Name**: Tiny扩充语言的语法树生成 - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-27 - **Last Updated**: 2026-11-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TinyExpressionSyntaxTree 编译原理实验 3:Tiny 扩充语言的语法树生成器。包含词法分析、语法分析与 缩进语法树打印,并提供可选的 Qt6 图形界面(语法树图形视图、错误列表、 源码编辑器)。 对原 TINY 语言的扩充(详见实验报告): - **if 改写**:`if (exp) 语句序列 [else 语句序列]`,`then`/`end` 废除; - **算术运算**:前置 `++` `--`、求余 `%`、乘方 `^`(右结合); - **比较运算**:`<=` `>` `>=` `<>`(原有 `<` `=` 保留); - **正则表达式**:`|`(或)、`&`(连接)、`#`(闭包)、`$`(正闭包)、 `?`(可选)、括号,原子为标识符/数字;新语句 `id ::= 正则表达式`; - **for 语句**:`for (id := exp; exp; ++id | --id) 语句序列`。 ## 目录结构 ``` src/ 核心库:Scanner / Parser / TreeNode / TreePrinter / Diagnosis,不依赖 Qt gui/ Qt Widgets 界面:左边源码编辑区,上边错误列表,右边语法树两个页签 main.cpp 命令行驱动:读 .tny,打印诊断与缩进语法树 tiny/ 第三方参考代码,见下文「版权说明」 docs/ 实验文档 ``` ## 依赖 | 工具 | 备注 | |---|---| | 编译器 | 支持 C++20 的 GCC 11+ / MSVC 19.3+ | | 构建工具 | CMake 3.16+ | | 图形界面 | Qt 6(Widgets 模块)。不装也能编命令行版,CMake 自动降级 | ## 快速开始 ### Linux ```bash cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel ``` 产物在 `build/bin/`:命令行版 `tiny`,装了 Qt6 还有图形版 `TinyExpressionSyntaxTree`。Qt 装在非默认路径时 configure 加一句: ```bash cmake -B build ``` ### Windows(MSVC + 官方 Qt) Qt 必须选 **MSVC 2022 64-bit** 套件(`msvc2022_64`),不要混用 `mingw_64`。机器上 PATH 里的 `cmake` 若来自 MSYS2,默认生成器是 Ninja, 容易拿 MinGW 编译器去配 MSVC 版 Qt,所以显式指定 VS 生成器: ```powershell # build 目录之前用别的生成器配过的话,先删掉再重新 configure cmake -E remove_directory build cmake -S . -B build -G "Visual Studio 18 2026" -A x64 ` -DCMAKE_PREFIX_PATH=C:\Qt\6.11.2\msvc2022_64 cmake --build build --config Release --target deploy --parallel .\build\bin\TinyExpressionSyntaxTree.exe ``` `--target deploy` 会在编译之后调用对应 Qt 套件的 `windeployqt`,把 `Qt6*.dll`、平台插件和 VC 运行库直接放到 exe 旁边,双击即可运行;只想 编译的话去掉 `--target deploy`,但单独拷 exe 会缺 DLL。整个 `bin` 目录压缩提交。 ### Qt Creator 1. 打开根目录的 `CMakeLists.txt`; 2. Kit 选 **Desktop Qt … MSVC2022 64bit**(Windows)或桌面版(Linux); 3. 构建、运行。IDE 运行时会自动把 Qt 的 `bin` 加进环境,但 exe 单独 拷出去仍需执行一次 `deploy` 目标。 ### CMake 选项 | 选项 | 默认 | 说明 | |---|---|---| | `TINY_EXPRESSION_SYNTAX_TREE_GUI` | `ON` | 找得到 Qt6 Widgets 就编图形界面,找不到只编命令行版 | | `TINY_EXPRESSION_SYNTAX_TREE_WIN_GUI` | `ON` | Windows 上 GUI exe 编成窗口子系统,双击不弹控制台 | | `TINY_EXPRESSION_SYNTAX_TREE_STATIC_QT` | `OFF` | 静态链接 Qt,产出单个 exe(见下) | ### 静态编译单个 exe(可选) 官方 `msvc2022_64` 是动态库版本,要单文件 exe 得用静态 Qt。Windows 的 MSYS2 UCRT64 shell 里: ```bash pacman -S mingw-w64-ucrt-x86_64-qt6-static # 如果未安装则运行 cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH=/ucrt64/qt6-static \ -DTINY_EXPRESSION_SYNTAX_TREE_STATIC_QT=ON cmake --build build ``` 该选项会显式导入平台插件(静态 Qt 不导入的话运行时报 "no Qt platform plugin could be initialized"),MinGW 下同时静态链入 libgcc / libstdc++。 ## 命令行版用法 ```bash build/bin/tiny 程序.tny # 单个文件 build/bin/tiny a.tny b.tny c.tny # 多个文件依次分析 ``` 输出每份源文件的诊断(行:列 + 消息)和缩进语法树。例如: ``` ======== t.tny ======== Start read(x) write + x 1 ``` 对应源程序 `read x; write x + 1`。缩进一层是一级孩子;同层语句缩进相同 (sibling 链)。退出码:`0` 全部通过,`1` 有错误,`2` 用法不对——适合 写脚本批量核对测试数据。 ## 图形界面怎么用 - **输入代码**:左侧编辑区直接敲或粘贴,带行号栏。 - **分析**:点【语法分析】或按 `F5`。上方的错误列表列出全部诊断 (类型 / 文件 / 行 / 列 / 消息),旁边是错误、警告计数。 - **是否生成语法树**:勾选框控制右侧是否填充树视图——不勾时只做 分析、报错误,对应作业「可由用户选择是否生成语法树」。 - **看树**:两个页签。「语法树(文本)」是和命令行一致的缩进形式; 「语法树(图形)」里实线连孩子、虚线连兄弟,滚轮缩放、按住拖动、 双击适应窗口。 - **文件**:菜单「文件」里新建 / 打开 / 保存 / 另存为,标准对话框。 ## 清理 ```bash cmake -E remove_directory build ``` ## 版权说明 / License - 本项目原创代码(`src/`、`gui/`、`main.cpp` 等)以 [MIT License](LICENSE) 授权。 - `tiny/` 下的代码为第三方内容,原样引自 Kenneth C. Louden 教材 *Compiler Construction: Principles and Practice*(PWS Publishing Co., 1997) 的配套发行包 loucomp.zip,版权归 Kenneth C. Louden 所有,仅限教育、 非商业用途,不属于本项目的 MIT 授权范围。详见 [tiny/NOTICE.md](tiny/NOTICE.md)。 ## 致谢 / Acknowledgements 感谢 Kenneth C. Louden 在教材中公开的 TINY 编译器与 TM 虚拟机, 为本实验提供了参考基础。