【问题标题】:C++ Parsing code (Hand written)C++ 解析代码(手写)
【发布时间】:2012-12-01 06:50:24
【问题描述】:

我需要解析一种类似于 Java 的最小化版本的语言。由于效率是我为手写解析器而不是像 GOLD、bison 和 yacc 这样的 LRAR 解析器生成器选择的最重要因素。

但是我找不到好的手写解析器背后的理论。似乎只有关于这些生成器及其背后机制的教程。

我必须放弃使用正则表达式吗?因为我可以想象它们比手写tokiners 慢。

有人知道手写解析的好课程或教程吗?

【问题讨论】:

  • 编译正则表达式(例如,并行 FSM)通常比手写的 LL(n) 更快。尽管我建议改为进行无词法分析。手写的 PEG(使用 Pratt 解析表达式)可以非常快,并且您仍然可以使用一些更高级别的模板来生成有效的代码。阅读有关 PEG 的更多信息,可能是有关 Packrat 解析和 Pratt 的信息,这应该是足够的理论。
  • P.S.,LLVM 的 Kaleidoscope 教程包括一个简单的手写解析器,它反过来反映了更复杂的 LLVM 和 Clang 解析方法(众所周知,效率很高)。
  • 老实说,只需简单的方法,然后对其进行基准测试。如果您确实需要手动编码某些东西,至少您将拥有一个功能正确的原型进行比较。 因为我可以想象它们很慢并不是从头开始编写如此复杂的东西的好理由。
  • @SK-logic 感谢您提供的信息!正是我需要的。
  • @Useless 是的。但我已经有了语法和解析器生成器生成工具。所以这是我的下一步。

标签: c++ parsing


【解决方案1】:

如果有帮助,这里(不是课程或教程,而是)一个手写解析器的示例:https://github.com/tabatkins/css-parser(但是它被明确编码为与规范的正确/简单对应,而不是针对优化高性能)。

我预计,更大的问题是制定解析规范。解析器规范的示例包括 http://dev.w3.org/csswg/css3-syntax/ 和用于解析 HTML5 的类似规范。

使用解析器生成器的先决条件是语言语法已由语法(其中语法格式由解析器生成器支持)定义,而不是由解析算法定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多