0

我正在尝试研究可能的解析器,作为开发可用于解析 Lin Descriptor File 的 PC 应用程序的一部分。当前的解析器应用程序基于 flex-bison 解析方法。现在我需要重新设计解析器,因为当前的解析器无法检测到特定的错误。

我以前使用过 Ragel 解析器(https://en.wikipedia.org/wiki/Ragel)来解析正则表达式(Regex:https ://en.wikipedia.org/wiki/Regular_expression )命令,事实证明它非常方便。

但是,由于当前的复杂性LDF-file,我不确定 Ragel(以 C++ 作为宿主语言)是否是解析LDF-file. 这样做的原因是LDF-file有很多数据不是固定的或恒定的,而是根据供应商而变化。此外,这些LDF字段必须保留对其他字段的引用以检测文件中的错误。当解析结构固定时,Ragel 更适合(这就是我在开发 Regex 解析器时发现的)

已经从事过此类项目的任何人都可以提供一些技巧来为 Lin Descriptor File 选择合适的解析器。

Lin 描述符文件示例:http ://microchipdeveloper.com/lin:protocol-app-ldf

4

1 回答 1

3

如果您觉得 LALR(1) 解析器不足以解决您的解析问题,那么有限自动机不可能更好。FA 严格来说没有那么强大。

但是在不了解您要实施的检查的性质的情况下,我很确定适当的策略是将文件解析为一些简单的分层数据结构(即某种形式的树,通常在解析文献中称为 AST ) 使用 flex/bison 语法,然后遍历生成的数据结构以执行任何必要的语义检查。

尝试在解析时进行语义检查通常会导致解决方案过于复杂、因素不当和不可扩展。这不是 bison 工具的问题,而是一种特殊的使用方式,它没有考虑到我们所了解的关注点分离的重要性。

重构你现有的语法,使它使用“只是一个语法”——也就是说,它只生成所需的语义表示——可能比用其他解析器生成器重新实现简单得多(这不太可能提供任何真正的优势,无论如何)。

而且您绝对应该抵制放弃解析器生成器以支持更模块化的解决方案的诱惑:您可能会成功构建一些东西,但结果可能会比您目前拥有的更难以维护和可扩展。

于 2017-05-16T15:58:47.683 回答