【问题标题】:What programs are there for parser generation?解析器生成有哪些程序?
【发布时间】:2009-03-18 09:08:55
【问题描述】:

我最近在学校上了一门课,在那里我们必须学习 Scheme,以便为一种简单的、类似于 Scheme 的语言构建解析器。随着学期的进行,我们添加到解析器中以使其变得越来越有趣。

从那时起,在我自己的时间里,我开始编写自己的解析器,它比我在课堂上所做的要简洁得多,但它会解析我的 C++ 代码,收集所有数据结构和公共成员的列表,并为其生成一个递归下降解析器。例如,如果我有以下内容

class Bar
{
public: 
    int a;
}

class Foo
{
public: 
    Bar* myBar;
    int x;
}

然后我在它上面运行我的解析器生成器,它会生成一个简单地称为 Parser 的新类,我可以像这样使用它来从文件中读取:

Parser p;
Foo* f = p.parseFoo("example.txt");

example.txt 是这样的:

Foo
{
    myBar
    {
        a 5
    }
    x 10
}

(这只是一个简单的例子,还有其他一些巧妙的东西,比如识别何时应该将其 push_back-ing 到向量上,并能够分配函数回调)

这似乎是其他人(可能更聪明)在我之前应该做的事情。我做了一些快速的谷歌搜索,看看那里有什么,但有很多东西要筛选。所以我的问题是:有没有工具可以做我的解析器生成器现在所做的事情?这个项目值得继续*还是已经有更好的工具了?

*当然,作为一种学习体验,它总是值得继续。相反,我的意思是从希望从文本读取数据结构的用户的角度来看。

【问题讨论】:

    标签: c++ parsing


    【解决方案1】:

    lex 和 yacc(或者更确切地说,flexbison)是强大的工具,可帮助您轻松生成常规语言的解析器。

    【讨论】:

      【解决方案2】:

      Boost.Spirit 非常令人印象深刻且有用。

      可以在here找到这方面的文档

      但请注意,解析 C++真的不容易

      【讨论】:

      • 我当前的程序设计为仅解析类的公共成员,只要您的代码格式正确并且您不使用任何宏,它就可以很好地处理这些成员。它甚至可以正确处理继承。
      • 即使只考虑类的公共成员,也有很多注意事项需要考虑。例如:命名空间、模板实例化、函数指针。
      【解决方案3】:

      Qt 有一个免费的工具,只有一点点文档,但没有太多开销。我已经用它为成熟的 DSL 创建了一个解析器。 QLALR

      【讨论】:

        【解决方案4】:

        lex/yacc 或 flex/bison。
        或 Boost.Spirit (http://spirit.sourceforge.net/)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2012-09-13
          • 1970-01-01
          相关资源
          最近更新 更多