【发布时间】:2011-09-12 18:36:08
【问题描述】:
许多(大多数)C++ 正则表达式库允许在运行时从字符串创建表达式。是否有人知道任何允许在运行时将表示为字符串的语法(最好是 BNF)提供给生成器的 C++ 解析器生成器?我发现的所有实现要么需要运行显式代码生成器,要么需要通过巧妙的模板元编程来表达语法。
【问题讨论】:
-
在运行时为整个解析器生成代码很强大,但可能不需要。除非您真的必须支持 abritary BNF 语法(顺便说一句,这是为了什么?),否则您可能可以编写一个足够灵活的解析器,以相对较少的麻烦适应语法中的某些变化。
-
@delnan,在运行时生成解析器在 Lisp 世界中是很常见的事情,尤其是现在,在 Packrat 时代。但是,为了在 C++ 中做同样的事情,必须遵守 Greenspun 的第十条规则。
-
元编程有什么问题?有什么比使用 Spirit 或 AXE 创建解析器更容易的呢?坦率地说,我不知道有任何类似 BNF 的解析器生成器会在易用性、性能或……任何方面击败这两个。只需为您的输入定义语法和语义即可。
-
@delnan 我曾经写过类似的东西——它是一个完整的 Earley 解析器,它是从一个语法文件动态构建的。我的代码正在替换现有代码(仅通过蛮力将 CFG 扩展为常规语法来处理 CFG),我们不得不使用现有的语法文件。但它本可以在另一种情况下以不同的方式(并且更有效地)完成。它是用 C 语言编写的,当时我正在寻找类似的东西。
-
@Gene 问题是语法是用户在运行时指定的。元编程根本不可能。
标签: c++ parsing runtime grammar parser-generator