
本文详解在 Ubuntu 环境下使用 Antlr4 正确编译 Oracle PL/SQL 语法文件(PlSqlLexer.g4 和 PlSqlParser.g4)生成 Python3 目标代码的完整流程,重点解决因误下载 GitHub HTML 页面导致的语法解析失败问题。
本文详解在 ubuntu 环境下使用 antlr4 正确编译 oracle pl/sql 语法文件(`plsqllexer.g4` 和 `plsqlparser.g4`)生成 python3 目标代码的完整流程,重点解决因误下载 github html 页面导致的语法解析失败问题。
在基于 Antlr4 构建 PL/SQL 语法分析器时,一个高频踩坑点是:直接使用 wget 下载 GitHub 上 .g4 文件的网页链接(如 https://github.com/.../blob/master/.../PlSqlLexer.g4),结果实际获取的是 HTML 源码而非原始 ANTLR 语法文本——这正是用户遇到 error(50): syntax error: '{"payload": {...}' 的根本原因。该错误并非语法或版本问题,而是 Antlr 工具试图解析 HTML JSON 结构体,自然报错。
✅ 正确做法是:始终通过 GitHub 的「Raw」链接下载纯文本语法文件。例如:
# ✅ 正确:使用 raw.githubusercontent.com 域名(自动跳转到原始内容) wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/PlSqlLexer.g4 wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/PlSqlParser.g4 wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/Python3/PlSqlLexerBase.py wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/Python3/PlSqlParserBase.py
⚠️ 注意:https://github.com/.../blob/... 是渲染后的网页 URL;而 https://raw.githubusercontent.com/... 才返回未经处理的原始 .g4 或 .py 文件。
完成文件准备后,按以下标准流程执行:
-
准备运行环境
mkdir -p lib grammars curl -o lib/antlr-4.9.3-complete.jar https://www.antlr.org/download/antlr-4.9.3-complete.jar
-
下载并归档语法文件
cd grammars wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/PlSqlLexer.g4 wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/PlSqlParser.g4 cd .. # 同时下载 Python 基类(可选但推荐,用于自定义错误处理和上下文) wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/Python3/PlSqlLexerBase.py wget https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/plsql/Python3/PlSqlParserBase.py
-
生成 Python3 词法/语法分析器代码
java -jar lib/antlr-4.9.3-complete.jar -Dlanguage=Python3 grammars/*.g4
成功执行后,grammars/ 目录将生成:
- PlSqlLexer.py, PlSqlParser.py(核心生成代码)
- PlSqlLexer.tokens, PlSqlParser.tokens, *.interp(元数据)
- PlSqlParserListener.py(默认监听器接口)
-
验证生成结果(可选)
创建简易测试脚本 runPLSQL.py:from antlr4 import * from grammars.PlSqlLexer import PlSqlLexer from grammars.PlSqlParser import PlSqlParser def main(): input_stream = InputStream("SELECT * FROM dual;") lexer = PlSqlLexer(input_stream) stream = CommonTokenStream(lexer) parser = PlSqlParser(stream) tree = parser.sql_script() print(tree.toStringTree(recog=parser)) if __name__ == '__main__': main()
? 关键注意事项总结:
- ✅ 必须使用 raw.githubusercontent.com 链接下载 .g4 文件,禁用 github.com/blob/...;
- ✅ Antlr4 运行时需匹配语法版本:当前 grammars-v4 中的 PL/SQL 语法兼容 Antlr 4.9.x,不建议混用 4.10+ 或旧版 runtime(如 antlr4-python3-runtime==4.9.3);
- ✅ 若需中文路径或特殊字符支持,请确保系统默认编码为 UTF-8(export PYTHONIOENCODING=utf-8);
- ✅ 生成的 *.py 文件依赖 antlr4-python3-runtime,请显式安装:
pip install antlr4-python3-runtime==4.9.3
遵循以上步骤,即可稳定、可复现地完成 PL/SQL 语法解析器的 Python3 代码生成,为后续 SQL 解析、静态分析或数据库工具开发奠定坚实基础。










