按照BNF定义进行解析的C库是什么?

4

我正在寻找一个能够接受定义BNF语法规则的字符串和待解析文本的字符串作为输入,并根据前者解析后者的库。需要注意的是,我不想使用需要编写源代码形式然后编译的方式来定义语法规则。


这个在线书籍中使用了一个,作者亲自编写。 - luser droog
在解析完成后,如果解析器返回“是”或“否”,您打算做什么? - Ira Baxter
1
无论你做什么,你都需要解析“源代码的定义”,因为这就是BNF的本质。如果它被“编译”,你为什么会反对呢? - Ira Baxter
在称呼BNF时要非常小心。许多所谓的BNF解析器使用了简化语法,虽然思想相同但并不是真正的BNF。例如,许多解析器省略了尖括号和::=符号。有些解析器则扩展了[]和{}用于重复。有些解析器更像JSON而不是BNF。 - cup
我回答了一个不同的问题,我认为它是你的同一答案。你想要指定语法和要解析的文本作为字符串吗?请参考https://dev59.com/QGs05IYBdhLWcg3wLfAj#22797616。 - Jerry Jeremiah
显示剩余3条评论
2个回答

1

libmarpa实现了Marpa算法,可以进行通用的BNF解析。然而,它不接受BNF作为字符串——您需要从字符串和词法分析器中构建语法,例如在这个JSON解析器中。

只是你所要求的一半,但可以说是最困难的一半。

同时,基于libmarpa的Marpa::R2正好可以做到您需要的--接受描述BNF和词法规则的字符串并构建识别器--您可以直接使用它来生成AST或通过语义动作进行评估。

有努力方便地包装libmarpa来做您所说的1, 2

还有一个Kollos项目,旨在使用Lua扩展和包装libmarpa。

希望能帮到您。


0

如果您的意图是仅解析小文件以进行“是否有效语法”的目的,则可以使用早期解析器。以这种方式解析大文件将非常缓慢。

您的问题将是定义标记;如果您在字符级别上进行 Earley 解析,您将获得一个解析,但它会比在语言标记上进行 Early-parsing 更差。

如果您想要更大规模的解析,您需要一个工具来定义标记和语法。这正是您所说不想要的东西。

如果您想要一个生成的工具,您可能能够修改 Earley 解析器以生成树。但回到效率:如果您想要一些规模,您可能需要一个用于管理树节点的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接