# ANTLR in Python Interpreter ## 配置教程 ### 配置 Antlr C++ 运行环境 Python 解释器采用 Antlr 作为前端语法分析器,其中核心代码编译时间较长,因此我们提前编译好了 Antlr 的运行环境,这样你的程序在编译时就不需要再编译 Antlr 的运行环境了。 为了在你自己的电脑上也使用 Antlr 运行环境,你需要将 Antlr 编译好的运行环境安装到你的电脑上。 将 `antlr-runtime_4.13.1_amd64.deb` 文件下载到 WSL 中,打开文件所在目录,执行以下命令安装: ```shell sudo apt install ./antlr-runtime_4.13.1_amd64.deb ``` 在这个包中,含有 Antlr 4.13.1 的动态链接库、静态链接库以及头文件,如果不装这个包, 将导致你的程序在编译时找不到 Antlr 的头文件和动态链接库,从而编译失败。 使用 Archlinux 的同学可以直接使用以下命令安装运行环境: ```shell pacman -S antlr4-runtime ``` 如有在其他环境下编程的同学(比如 Windows、Mac 和除 Debian,Arch 之外的 Linux 系统),请联系助教。 ### 生成语法树 #### 使用 VScode 插件(推荐) 首先在 Windows 环境下安装插件(注意,不要在 WSL 环境下安装): ![vscode-plugin](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/vscode-plugin.png) 安装后,点击卸载旁的箭头,安装 2.3.1 版本。 ![vscode-install](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/vscode-install.png) 安装完后重新加载。打开 `Python3.g4` 文件,右边会出现对应插件的图标,点击,等待其中的 PARSER RULES 等部分加载完毕。 ![vscode-antlr](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/vscode-antlr.png) 接下来配置运行文件。点击左侧的运行和调试,创建 `launch.json` 文件,并写入 ```javascript { "version": "2.3.1", "configurations": [ { "name": "Debug ANTLR4 grammar", "type": "antlr-debug", "request": "launch", "input": "./a.txt", // 输入文件(即你要运行的 Python 代码文件) "grammar": "./resources/Python3Parser.g4", // 语法文件 "startRule": "file_input", // 语法入口规则,我们的公式语法入口规则是 file_input "printParseTree": true, // 是否 打印/可视化 parse tree "visualParseTree": true } ] } ``` 最后打开要运行的文件,在左侧的运行和调试中,点击运行即可生成,如下图所示。 ![vscode-antlr-result](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/vscode-antlr-result.png) #### 使用 Clion 插件 由于本次 `.g4` 文件的特性,目前 ANTLR 插件只能支持不带 `INDENT` 和 `DEDENT` 规则的解释。 首先在插件市场中找到插件: ![plugin-market](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/plugin-market.png) 安装后,右键 `.g4` 中的 `return_stmt` 或任何不包含 `INDENT` 和 `DEDENT` 的规则,点击 `test rule`: ![right-click](https://github.com/ACMClassCourse-2023/Python-Interpreter-2023/blob/main/docs/right-click.png) 之后在屏幕下方的 `antlr-preview` 中,左侧是待测试的代码,右侧是依据代码生成的语法树结构图。 ## ANTLR 是什么 ANTLR(全名:ANother Tool for Language Recognition)是基于 LL(\*)算法实现的语法解析器生成器(parser generator),用 Java 语言编写,使用自上而下(top-down)的递归下降 LL 剖析器方法。 ANTLR 可以将输入的代码转化成与之对应的**树形结构**,即语法树,以便后续程序操作。按照上面的配置操作,即可得到一份 `Python` 代码对应的语法树。