Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C++ BISH解析器移植到C++_C++_C_Bison - Fatal编程技术网

将C++ BISH解析器移植到C++

将C++ BISH解析器移植到C++,c++,c,bison,C++,C,Bison,我使用基于可重入FLEX C的扫描器和基于可重入bison C的解析器。它很好用 希望保持可重入C的Flex扫描仪,并获得基于C++的基于BISEN的解析器。 为什么??当输入太复杂,if-else-if链太长时,bison堆栈大小的限制就是一个问题。另外,我不喜欢没有文档记录的解决方案,也不喜欢那些作者说会有变化的解决方案等等。这就是为什么我希望保留基于C的FLEX scanner 此外,我需要使用特定的前缀或后缀或命名空间来使用多个可重入的基于Flex C的扫描仪和可重入的BISEN C++

我使用基于可重入FLEX C的扫描器和基于可重入bison C的解析器。它很好用

希望保持可重入C的Flex扫描仪,并获得基于C++的基于BISEN的解析器。 为什么??当输入太复杂,if-else-if链太长时,bison堆栈大小的限制就是一个问题。另外,我不喜欢没有文档记录的解决方案,也不喜欢那些作者说会有变化的解决方案等等。这就是为什么我希望保留基于C的FLEX scanner

此外,我需要使用特定的前缀或后缀或命名空间来使用多个可重入的基于Flex C的扫描仪和可重入的BISEN C++分析器。


> XYX

< P>假设您想用Flex和BySon编写C++中的解析器,这里给出了答案。 为您的问题提供答案。本文作者以OO方式自由使用C++中的Flex和BySee。对于Flex,您可以使用%{…%}代码块。另一方面,在BISY的情况下,这就是真正的泛型解析器根据C++作者的用法:

%骨架lalr1.cc %需要3.0 %调试 %定义 %定义api.namespace{MC} %定义语法分析器\u类\u名称{MC\u语法分析器} %代码要求{ 名称空间MC{ mcu类驱动器; mcu类扫描仪; } //如果未使用%位置,则缺少以下定义 ifndef YY_NULLPTR
如果定义了“.lcPLUS PLUS”和“201103L”< P> >在C++程序中,您不必使用Flex的C++模板。在FC++中,Flex生成的C代码应该正确编译和执行。至少,我还没有看到问题。正如Flex文档中所指出的,生成的C代码中的任何C++不兼容都将被视为bug,应该是ReP。被认为是这样的

话虽如此,如果您对bison的C模板唯一关心的是对解析器堆栈大小的限制,那么您可以通过定义YYMAXDEPTH轻松地增加限制。特别是,您可以通过使用:

#define YYMAXDEPTH (YYSTACK_ALLOC_MAXIMUM / YYSTACK_BYTES (1))
该公式源自skeleton data/yacc.c中的注释:

我不知道这个评论是否真的构成正式的文档,但是它似乎是针对那些可能考虑改变YyMax深度值的人,所以我假设依赖它是可以的。——另一方面,你可能会考虑施加一些较小的限制,因为把它留给MALOC来报告分配失败-WH。ich是上述定义的结果-在使用乐观内存分配的平台上是出了名的不可靠


不允许通过转换为C++来分配乐观内存,因为BISY的C++模板依赖于STD::vector来报告内存分配失败,而且我知道的任何标准库实现都不可能预测乐观分配内存的未来不可用性。对于BiSon的C++实现,HANGE?否则,没有什么可以阻止你在BySun动作中使用C++代码。你可能想搜索BySe++。@某程序员:BiSee的C++模板使用STD::vector实现解析器堆栈,将它留给标准库数据类型来实现任何大小限制。我不相信大多数STD::VECTTO如果出现分配失败,r实现除了响应分配失败之外,什么都可以做;众所周知,具有乐观内存分配的平台通常不会以有用的方式报告分配失败。

/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
   if the built-in stack extension method is used).

   Do not make this value too large; the results are undefined if
   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
   evaluated with infinite-precision integer arithmetic.  */