C++ 如何将CFG转换为c++;代码
我有一个上下文无关语法(CFG)。我想写一个C++代码来做同样的事情,比如CFG。 是否有任何内置功能或简单的转换方法?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的东西?您可能想看看
bison
,这是yacc
的GNU实现,它代表另一个编译器
,它将根据您提供给它的语法生成解析器。您可能想看看bison
,“代码> yACC 的GNU实现,它代表了<代码>,但另一个编译器编译器,将从您所给的语法生成语法分析器。 < P>没有这样的C++ BuiTin,但是您有一些替代方案。
< > >语法分析器生成器:Flex + BySun允许您在语法(La)LR或GLR表单中生成C或C++的解析器。如果您对CFG有很好的掌握,学习Bison语法将很容易。BISON和Flex将输出C代码,但它们可以在语义动作中优雅地处理C++。
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++。
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解析器非常容易获取和使用