C++ 如何将CFG转换为c++;代码

C++ 如何将CFG转换为c++;代码,c++,c,context-free-grammar,C++,C,Context Free Grammar,我有一个上下文无关语法(CFG)。我想写一个C++代码来做同样的事情,比如CFG。 是否有任何内置功能或简单的转换方法? 或者,执行CFG的东西?您可能想看看bison,这是yacc的GNU实现,它代表另一个编译器,它将根据您提供给它的语法生成解析器。您可能想看看bison,“代码> yACC 的GNU实现,它代表了,但另一个编译器编译器,将从您所给的语法生成语法分析器。 < P>没有这样的C++ BuiTin,但是您有一些替代方案。 < > >语法分析器生成器:Flex + BySun允许您在

我有一个上下文无关语法(CFG)。我想写一个C++代码来做同样的事情,比如CFG。 是否有任何内置功能或简单的转换方法?
或者,执行CFG的东西?

您可能想看看
bison
,这是
yacc
的GNU实现,它代表
另一个编译器
,它将根据您提供给它的语法生成解析器。

您可能想看看
bison
,“代码> yACC 的GNU实现,它代表了<代码>,但另一个编译器编译器,将从您所给的语法生成语法分析器。

< P>没有这样的C++ BuiTin,但是您有一些替代方案。 < > >语法分析器生成器:Flex + BySun允许您在语法(La)LR或GLR表单中生成C或C++的解析器。如果您对CFG有很好的掌握,学习Bison语法将很容易。BISON和Flex将输出C代码,但它们可以在语义动作中优雅地处理C++。
  • 自上而下的解析器:如果您的语法是LL(k)形式,并且您不想学习额外的语言,那么您可以很容易地从语法派生递归下降解析器。这很快,但LL不如(G)LR强大,如果您对所有边缘情况都不特别小心,那么手工编写解析器很快就会成为一场噩梦。LL解析器也可以实现为表解析器(如LR),但手工编辑表迟早会变得一团糟

  • BISY还可以发出C++类而不是函数,只需添加:

    %skeleton "lalr1.cc"
    %language "c++"
    %define parser_class_name {Parser}
    
    开场白。唯一的区别是,现在令牌是枚举的成员,没有更多的定义,因此您必须使用
    Parser::token::token\u NAME
    而不是
    token\u NAME


    Flex也可以是ehm。。。锤击。。。生成C++类,但有BISE+ C++和Flex C++点击在一起并不是简单明了的,值得单独的问题。

    没有这样的C++ BuiTin,但是你有几个替代方案。 < > >语法分析器生成器:Flex + BySun允许您在语法(La)LR或GLR表单中生成C或C++的解析器。如果您对CFG有很好的掌握,学习Bison语法将很容易。BISON和Flex将输出C代码,但它们可以在语义动作中优雅地处理C++。

  • 自上而下的解析器:如果您的语法是LL(k)形式,并且您不想学习额外的语言,那么您可以很容易地从语法派生递归下降解析器。这很快,但LL不如(G)LR强大,如果您对所有边缘情况都不特别小心,那么手工编写解析器很快就会成为一场噩梦。LL解析器也可以实现为表解析器(如LR),但手工编辑表迟早会变得一团糟

  • BISY还可以发出C++类而不是函数,只需添加:

    %skeleton "lalr1.cc"
    %language "c++"
    %define parser_class_name {Parser}
    
    开场白。唯一的区别是,现在令牌是枚举的成员,没有更多的定义,因此您必须使用
    Parser::token::token\u NAME
    而不是
    token\u NAME

    Flex也可以是ehm。。。锤击。。。生成C++类,但有BISC++ C++和Flex C++点击并不是非常简单,值得单独的问题。

    < p>你正在寻找(有时称为编译器编译器)。你已经知道野牛的事了。你可以试试(或者用Java)。这是一本书

    顺便说一句,大多数编程语言并不是真正的上下文无关的(例如,因为它们需要一些上下文)

    此外,一些解析器是手工编写的(例如GCC,请参阅)

    注意,a是一些形式语法的规范(可以在一些解析器中实现)。但也很重要。

    您正在寻找(有时称为编译器)。你已经知道野牛的事了。你可以试试(或者用Java)。这是一本书

    顺便说一句,大多数编程语言并不是真正的上下文无关的(例如,因为它们需要一些上下文)

    此外,一些解析器是手工编写的(例如GCC,请参阅)


    注意,a是一些形式语法的规范(可以在一些解析器中实现)。另一种选择是用“代码> Boo::Soals< /Cuff>纯C++解决方案,但需要依赖Boosivs/P>>P.另一种选择是用.Cux:Boo::Sudio纯C++解决方案来构造解析器,但是需要依赖Boosib/P>。CFG不做任何事情,它只是描述了一个结构。你想建立一个分析器来解析你的CFG,对吗?我需要C++代码,它就像CFG下面的解析器一样工作。CFG什么也不做,它只是描述了一个结构。你想建立一个分析器来解析你的CFG,对吗?我需要C++代码,它就像CFG下的解析器。实际上我已经用BISO/YACC来做了。现在我正试图用c++来实现它,为什么要重新发明轮子呢?Bison是用C写的。实际上我已经用Bison/yacc完成了。现在我正试图用c++来实现它,为什么要重新发明轮子呢?Bison是用C写的。所以,如果我想写一个代码来实现CFG,我需要写很多“If语句”。。要做到这一点并不容易?@AerofoilKite只有当你的语法是LL(k)(并且是确定性的)时,它才会起作用。也就是说,在任何给定点,您都可以根据读取的下一个
    k
    字符来决定要执行的操作。因此,是的,您读取这些
    k
    字符,并根据它们选择要调用的函数。被调用的函数可以执行相同的操作。这就是为什么它被称为“递归下降”。谷歌就是这样,互联网上有大量的教程。老实说,你也可以手工实现LALR解析器,但一旦语言不再琐碎,语法的每一次更改都可能导致解析表中的许多细微变化,这将变得非常痛苦。此外,由于它们的工作方式,一个错误的LALR解析器非常容易获取和使用