2

在过去的几周里,我一直潜入将 SQL 语句解析为可管理的东西的美丽世界,只是发现我可能需要一个完整的词法分析器/解析器来正确处理所有允许的标记/格式来执行一样。

我最感兴趣的是 create table 语句,但一个完整的通用解析器会更好,因为网络上似乎还没有人拥有这个。

我不是计算机专业的毕业生,而是一个自学成才的人,所以这对我来说是一个相当大的学习曲线。我采取的步骤是:

  1. 使用正则表达式解析 sql
  2. 失败,修复正则表达式
  3. 更糟糕的是,挖掘 SQLite 源代码,发现它使用了 Lemon 解析器,这是一个特定于 SQLite 的项目
  4. 尝试让 Lemon + PHP 解析器工作,认为我可以手动将其转换为 js。(失败的)
  5. 尝试让 Emscripten 在 C 中处理 Lemon 生成的解析器(依赖地狱,失败。)
  6. 搜索其他解析器/词法分析器生成器,注意 ANTLR3
  7. 日夜尝试通过更改输出格式和回溯错误将Sqljet语言文件转换为javascript。

我一直在使用出色的AntlrWorks GUI 来尝试找出问题所在,但我不确定是 Javascript 堆栈出了问题,还是 Java 堆栈,或者 .g 格式是 v2 的旧格式。

是否有任何具有解析器/词法分析器生成器经验的人可以指出正确的方向来生成正确的可重用 Sqlite 解析器?我似乎能够在 javascript 中为 mysql 和 pl/sql 生成解析器。这是否意味着 sqlite .g 格式需要更新?

4

1 回答 1

1

为了能够对 JavaScript 目标使用语法,您必须:

  • 更改options块中的目标语言:options { language=JavaScript; }
  • 使用 JavaScript 代码更改.g语法文件中的所有嵌入代码(和之间的内容)。请注意,ANTLR 不会根据您在'值中定义的内容转换此代码,您必须自己执行此操作!{}optionslanguage
  • 生成解析器时,不要使用 ANTLRWorks,而是在命令行上这样做,并使用 java 的-Xmx参数使用大量堆:SQL 语法是需要大量内存的大型野兽

这是以前的问答,展示了如何结合 JavaScript 目标使用(和运行)ANTLR 生成的解析器:antlr3 - 生成解析树

高温高压

于 2012-08-06T16:04:06.983 回答