小编bpw*_*621的帖子

适用于yacc/byacc/bison和lex/flex

我读到的与这些实用程序有关的大多数帖子通常都建议使用其他方法来获得相同的效果.例如,通常提到这些工具的问题至少有一个答案包含以下一些内容:

  • 使用boost库(在此插入适当的boost库)
  • 不要创建DSL使用(在这里插入喜欢的脚本语言)
  • Antlr更好

假设开发人员......

  • ...对C语言感到满意
  • ...确实知道至少一种脚本语言(例如,Python,Perl等)
  • ...必须在几乎所有项目中编写一些解析代码

所以我的问题是:

  • 什么是适合这些公用事业的适当情况?
  • 是否存在任何(合理的)情况,除了yacc和lex(或衍生物)之外没有比问题更好的替代方案?
  • 在实际的解析问题中,有多少人会期望遇到yacc和lex中的任何缺点,这些缺点可以通过更新的解决方案得到更好的解决?
  • 对于那些还不熟悉这些工具的开发人员来说,花时间学习他们的语法/习语是值得的吗?这些与其他解决方案相比如何?

parsing yacc flex-lexer

6
推荐指数
1
解决办法
2374
查看次数

提升精神和Lex解析器问题

我一直在努力尝试(逐步)修改文档中的示例代码,但没有太大的不同,我没有得到我期望的行为.具体来说,"if"语句在(我的意图是)它应该传递时失败(有一个"else"但是在调试期间删除了部分解析器).赋值语句工作正常.我有一个"while"语句,它与"if"语句有同样的问题,所以我相信如果我能得到帮助来弄清楚为什么一个不工作它应该很容易让另一个去.它必须是一种微妙的,因为这几乎是逐字逐句的,其中一个例子.

#include <iostream>
#include <fstream>
#include <string>

#define BOOST_SPIRIT_DEBUG
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_statement.hpp>
#include <boost/spirit/include/phoenix_container.hpp>

namespace qi  = boost::spirit::qi;
namespace lex = boost::spirit::lex;

inline std::string read_from_file( const char* infile )
{
    std::ifstream instream( infile );
    if( !instream.is_open() )
    {
        std::cerr << "Could not open file: \"" << infile << "\"" << std::endl;
        exit( -1 );
    }
    instream.unsetf( std::ios::skipws );
    return( std::string(
                std::istreambuf_iterator< char >( instream.rdbuf() ),
                std::istreambuf_iterator< char >()
          ) );
}

template< typename …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-qi

6
推荐指数
2
解决办法
3357
查看次数

可以编写一个接受类型并返回不同类型的函数

是否可以编写一个接受类型并返回(相关)类型的函数.例如,一个函数采用一个名为"RandomVariable"的类型并返回一个名为"RandomVariableCovariance"的类型.我猜一般来说问题是类型名是否可以是参数或返回类型.C++ 0x很好.

c++ c++11

5
推荐指数
1
解决办法
212
查看次数

unique_ptr,nullptr和支持gcc 4.5.x和4.6.x.

我正在开发一个有两个不同最终用户的库,其中一个使用gcc 4.5.3而另一个只是移动到gcc 4.6.3.该库使用新的C++ 11智能指针(特别是unique_ptr)并在gcc 4.5.3上编译良好.但是,在这两个版本之间,gcc开始支持nullptr,因此unique_ptr的API更改为更接近标准.现在这样做,以下代码从精细到模糊

unique_ptr up( new int( 30 ) );
...
if( up == 0 ) // ambiguous call now to unique_ptr(int) for 0
Run Code Online (Sandbox Code Playgroud)

是否有一个干净的(即,下一句)方式来改变上面的if语句,以便它可以使用和不使用nullptr?如果可能的话,我想避免配置检查,然后像下面的宏(我认为可行)

#if defined NULLPOINTER_AVAILABLE
  #define NULLPTR (nullptr)
#else
  #define NULLPTR (0)
#endif
Run Code Online (Sandbox Code Playgroud)

或者这是获得我正在寻找的行为的唯一方法吗?

c++ gcc unique-ptr nullptr c++11

5
推荐指数
1
解决办法
2911
查看次数

具有整数模板参数指定的参数数量的类方法

不确定如何用短语来表达这个问题或搜索什么,如果这与其他问题相同,请关闭并重定向到相应的问题.

假设

template<typename Type, int Size> class vector
{
  Type data[Size];
}
Run Code Online (Sandbox Code Playgroud)

是否可以替换一个构造函数,该构造函数在模板特化中使用大小数量的参数

template<typename Type> class vector3<Type,3>
{
  Type data[3];
  public:
    vector3( Type, Type, Type );
}
Run Code Online (Sandbox Code Playgroud)

在非专业模板类中的东西?就像一个"varargs构造函数",它生成一个构造函数,其大小为类型为Type的参数?

涉及C++ 0x功能的解决方案很好.

c++ oop templates c++11

4
推荐指数
1
解决办法
553
查看次数

我是否支付默认施工费用,如果可以,我可以避免

如果T建造成本高,我想知道我是否支付以下情况下的默认施工(我想我这样做)

std::function< T() > make_t;
std::vector< T > t( 100000 );
std::generate( t.begin(), t.end(), make_T );
Run Code Online (Sandbox Code Playgroud)

如果我必须付钱,我可以避免吗?我想写点类似的东西

std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.end(), make_T );
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它不会将t.end()移动到保留的末尾.以下是安全/可取/正确的吗?

std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.begin() + 100000, make_T );
Run Code Online (Sandbox Code Playgroud)

我还以为我可以使用back_inserter,但接口适合我所拥有的(我有一个函数,每次访问时都会生成一个新的T对象,而不是一对迭代器到一个范围).

C++ 0x解决方案优于C++ 03解决方案(即,如果有更好的方法,那么利用新标准的解决方案)优先选择需要使用boost的解决方案.

c++ boost c++11

4
推荐指数
1
解决办法
195
查看次数

未定义的行为或误报

我(基本上)在野外遇到以下情况

x = x = 5;
Run Code Online (Sandbox Code Playgroud)

显然在早期版本的gcc下完全编译(在gcc 4.5.1下生成警告).据我所知,警告是由-Wsequence-point生成的.所以我的问题是这是否违反了关于在序列点之间操纵变量的标准中的措辞(即,它是根据规范的未定义行为)或者这是gcc误报(即,它是根据规范定义的行为)?关于序列点的措辞有点难以理解.

我说的基本上是因为我实际遇到的(在更大的表达中)是

x[0][0] = x[0][0] = 5;
Run Code Online (Sandbox Code Playgroud)

但我认为这不是警告的重要因素(请纠正我,如果这是重点,而不是我认为是问题的关键).

c++ gcc g++ gcc-warning

3
推荐指数
1
解决办法
206
查看次数

成员函数替代名称

我正在尝试为函数调用创建替代名称,numberedFunction如下所示具有某些值

template< typename T >
class X
{
  public:

    X() : single( std::bind( &X::numberedFunction, *this, 1 ) ),
          halfDozen( std::bind( &X::numberedFunction, *this, 6 ) )
    { ... }

    T numberedFunction( unsigned int i ) { ... }

    const std::function< T() >& single;
    const std::function< T() >& halfDozen;
};
Run Code Online (Sandbox Code Playgroud)

但是这段代码不正确(当我尝试使用任何特别命名的函数时会出现段错误).使用this我在初始化列表中的方式是否存在问题(例如,当我在那里访问它时,这是不是保证良好的形式)?别的(显而易见的)?有没有更好的方法来做我想做的事情(我觉得几乎肯定是)?

c++ c++11

2
推荐指数
1
解决办法
158
查看次数

为什么不在fill_n中调用move构造函数

我得到的错误说fill_n下面的行试图使用已删除的复制构造函数:为什么它不尝试使用移动构造函数?我尝试将它包装在一个std::move但没有帮助.

std::vector< std::thread > workers;
workers.reserve( 10 );
std::fill_n( std::back_inserter( workers ), 10, std::thread( []{ std::cout << "thread\n"; } ) );
Run Code Online (Sandbox Code Playgroud)

但是,如果我将fill_n行更改为

for( int i = 0; i < 10; ++i )
{
  workers.push_back( std::thread( []{ std::cout << "thread\n"; } ) );
}
Run Code Online (Sandbox Code Playgroud)

工作正常.我认为这些基本上与我之前从一个到另一个的变化相同,之前有些相似的代码.

multithreading stl-algorithm c++11

2
推荐指数
1
解决办法
102
查看次数

有没有"大名实体"发布C++ 0x语法最佳实践

虽然这种"对话"很快就会变成像"这就是我的想法......"这样的问题但问题并非如此.是否有任何"大名鼎鼎的实体"(例如谷歌或喜欢的歌曲,斯科特迈耶斯等等)发布了任何免费提供的内容,这些内容决定/建议他们认为代码库的语法指南行应该适用于某些/任何C++ 0x功能?

例如,我已经看到了各种模板的示例代码,这些模板以相对于省略号的不同间距编写.有没有人权衡过任何人对一些/所有结构中最具表现力/可读性的信念的评价?

@jalf:即使你不相信任何人应该告诉你如何做这些琐事,也有大型组织在其编码标准中有格式相关标准的例子(例如Google,Gnu),但这些并不与C++ 0x功能(这就是我的要求).

c++ coding-style c++11

1
推荐指数
1
解决办法
385
查看次数