在过去的几周里,我一直在深入研究将SQL语句解析成可管理的东西的美好世界,结果发现我可能需要一个完整的lexer/parser来正确处理所有允许的令牌/格式来做同样的事情。
我最感兴趣的是创建表语句,但一个完整的通用解析器会更好,因为网络上似乎还没有人拥有它。
我不是计算机专业的毕业生,而是一个自学成才的人,所以这是我的学习曲线。我采取的步骤是:
- 使用正则表达式分析sql
- 如果失败,请修复regex
- 更糟糕的是,通过挖掘SQLite源代码,发现它使用了Lemon解析器,这是一个SQLite特定的项目
- 试着让Lemon+PHP解析器工作,我认为我可以手动将其转换为js。(失败)
- 尝试让Emscripten在C中处理Lemon生成的解析器(依赖地狱,失败)
- 搜索其他解析器/lexer生成器,注意ANTLR3
- 夜以继日地尝试通过更改输出格式和回溯错误将Sqljet语言文件转换为javascript
我一直在使用出色的AntlrWorks GUI来尝试找出问题所在,但我不确定是Javascript堆栈、Java堆栈,还是.g格式是v2的旧格式。
有没有任何拥有解析器/lexer生成器经验的人可以为我指明生成正确的可重用Sqlite解析器的正确方向?我似乎能够用javascript为mysql和pl/sql生成解析器。这是否意味着sqlite.g格式需要更新?
要能够将语法与JavaScript目标一起使用,您必须:
- 更改
options
块中的目标语言:options { language=JavaScript; }
- 用JavaScript代码更改.g语法文件中的所有嵌入代码(
{
和}
之间的内容)。请注意,根据您在options
'language
值中定义的内容,ANTLR不会转换此代码,您必须自己完成 - 在生成解析器时,不要使用ANTLRWorks,而是在命令行中使用,并使用大量带有java的
-Xmx
参数的堆:SQL语法是需要大量内存的大型野兽
这是之前的一个问答;展示如何将ANTLR生成的解析器与JavaScript目标结合使用(并运行):antlr3-生成解析树
HTH