我正在尝试为我们开发的查询语言构建随机查询生成器。这个想法是通过遵循解析表中的规则来生成随机查询。到目前为止,我尝试过的所有LL解析器生成器只生成递归下降解析器。我可以尝试修改生成的解析器,但是看一下ANTLR为一个微小的表达式语言生成的解析器,我们的查询语言的解析器将非常大。
所以,我认为一个表驱动的解析器会更小,更容易调整。是否有任何开源工具可以生成表驱动的LL解析器?
或者,可以“反向”使用LR解析表来导出随机查询吗?
答案 0 :(得分:3)
是的,LR解析器表可用于生成随机查询。您只需遍历表,就像解析一样,并且状态表提供转换或减少令牌的任何位置,您随机提出该令牌,一旦查询大小“足够大”,优先缩减。令牌序列是您的查询。
但是你不需要LR表;您可以以类似的方式遍历语法定义(一组BNF规则)。您需要先将所有规则规范化为以下格式:
LHS = RHS1 RHS2 ... RHSn ;
通过添加新生成的非终结符来表示原始规则中的复杂子短语,可以摆脱Kleene星和加号以及替代方案。这很简单。
如果你有一个非终端(最初是目标符号),只需查找匹配LHS的规则,随机选择一个,然后展开该规则。您必须将规则中的位置跟踪为“点”(与LR解析器生成中的“项目”相同)。给定一个规则和一个点,选择的令牌是一个终端(建议它,别无选择!)或非终端(递归生成非终端的令牌序列) 使用本段的方法)。