小编Exa*_*gon的帖子

使用boost.spirit时弃用警告

我正在尝试用boost.spirit.qi编写一些解析器,但是当我编译时,我得到以下不推荐的警告:

In file included from /usr/include/boost/iostreams/detail/is_dereferenceable.hpp:12:0 ... 

#pragma message: NOTE: Use of this header (bool_trait_def.hpp) is deprecated

#pragma message: NOTE: Use of this header (template_arity_spec.hpp) is deprecated
Run Code Online (Sandbox Code Playgroud)

我使用错误的解析器还是旧的?我怎样才能摆脱这些警告?

编辑:我/usr/include/boost/iostreams/detail/is_dereferenceable.hpp正在以某种方式包括/usr/include/boost/spirit/include/qi.hpp 使用Boost版本1.61

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

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

将 ListView 绑定到 ObservableSet

我想知道是否有办法将 an 绑定ObservableSet到 aListViewObservableList双向绑定到 an ObservableSet

java user-interface javafx observable

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

提升精神x3 int32 | double_无法解析double

我正在尝试编写一个解析器,它解析a int32_t或a double.作为第一次尝试,我写了这个解析器:

const auto int_or_double = boost::spirit::x3::int32 | boost::spirit::x3::double_;
Run Code Online (Sandbox Code Playgroud)

我期望得到一个boost::variant<int32_t, double> 解析器成功解析整数,12, 100, -42, 7但它无法解析双打像13.243, 42.7, 12.0 -10000.3

这是一个现场演示

为什么这个解析器在双打时失败?

c++ parsing boost-spirit c++14 boost-spirit-x3

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

函数CMake的未定义参考

我正在尝试学习CMake,但是我得到一个未定义的引用...链接器错误我有一个带有子目录的目录.他们每个人都有自己的CMakeLists.txt

test
|----main.cpp
|----CMakeLists.txt
|----test2
     |----foo.hpp
     |----foo.cpp
     |----CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

用于测试的CMakeLists.txt是:

cmake_minimum_required(VERSION 3.5)
project(tests)

add_subdirectory(test2)
set(SOURCE_FILES main.cpp)
add_executable(tests ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)

test2的CMakeLists.txt是:

set(test2_files
        foo.cpp
        foo.hpp
        )
add_library(test2 ${test2_files})
Run Code Online (Sandbox Code Playgroud)

foo.cpp实现了foo.hpp 为此函数定义的函数我得到了未定义的引用错误.我究竟做错了什么?如何摆脱此链接器错误

编辑:我的CMakeLists.txt现在看起来像这样,但我仍然得到链接器错误:

project(tests)

cmake_minimum_required(VERSION 2.8)

set(SOURCE_FILES main.cpp)

include_directories(test2)
link_directories(test2)

add_subdirectory(test)

add_executable( ${PROJECT_NAME} ${SOURCE_FILES} )

target_link_libraries(${PROJECT_NAME} test2)
Run Code Online (Sandbox Code Playgroud)

我也尝试用绝对路径而不是 test2

编辑:解决了它只是test2的CMakeLists.txt中的一个错字.

c++ linker build cmake

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

C++ 正则表达式替换第一个匹配项

我试图编写一个类似于 Java 的Matcher::replaceFirst(String replacement). 我知道如何更换所有比赛中std::string,有std::regex_replace,但我怎么能只替换字符串中的正则表达式的第一场比赛?

c++ regex string c++11

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

用容器解析结构

如何使用boost.spirit x3解析为如下结构:

struct person{
    std::string name;
    std::vector<std::string> friends;
}
Run Code Online (Sandbox Code Playgroud)

来自boost.spirit v2我会使用语法,但由于X3不支持语法,我不知道如何干净.

编辑:如果有人可以帮我编写一个解析字符串列表的解析器并返回一个person第一个字符串是名称并且字符串的res在friends向量中,那将是很好的.

c++ boost boost-spirit c++14 boost-spirit-x3

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

解析除关键字之外的标识符

我正在努力编写一个标识符解析器,它解析一个不是关键字的字母字符串。关键字都在一个表中:

struct keywords_t : x3::symbols<x3::unused_type> {
    keywords_t() {
        add("for", x3::unused)
                ("in", x3::unused)
                ("while", x3::unused);
    }
} const keywords;
Run Code Online (Sandbox Code Playgroud)

标识符的解析器应该是这样的:

auto const identifier_def =       
            x3::lexeme[
                (x3::alpha | '_') >> *(x3::alnum | '_')
            ];
Run Code Online (Sandbox Code Playgroud)

现在我尝试将这些组合起来,以便标识符解析器在解析关键字时失败。我是这样试的:

auto const identifier_def =       
                x3::lexeme[
                    (x3::alpha | '_') >> *(x3::alnum | '_')
                ]-keywords;
Run Code Online (Sandbox Code Playgroud)

和这个:

auto const identifier_def =       
                x3::lexeme[
                    (x3::alpha | '_') >> *(x3::alnum | '_') - keywords
                ];
Run Code Online (Sandbox Code Playgroud)

它适用于大多数输入,但如果字符串以关键字开头,例如int, whilefoo, forbar解析器无法解析此字符串。我怎样才能让这个解析器正确?

c++ parsing boost-spirit c++14 boost-spirit-x3

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

Vala泛型为C代码

我正在阅读语言vala,它编译成Ansi C代码.但是我也看到它支持Java或Rust等泛型.现在我的问题是如何将其编译为C代码?如果我有一个泛型类或函数,生成什么样的C代码来模拟通用行为?

c compiler-construction generics vala

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

Boost.x3:属性在备选方案之间累积

我有一个用于解析标识符的解析器foo, bar, baz和一个用于解析嵌套标识符的解析器,foo::bar, foo::bar.baz, foo::bar.baz.baham 它们都解析为相同的ast结构,如下所示:

struct identifier : x3::position_tagged{
    std::vector <std::string> namespaces;
    std::vector <std::string> classes;
    std::string identifier;

};
Run Code Online (Sandbox Code Playgroud)

解析器identifier看起来像这样:

#define VEC_ATR x3::attr(std::vector<std::string>({})) //ugly hack

auto const identifier_def =
                VEC_ATR
                >> VEC_ATR
                >> id_string;
Run Code Online (Sandbox Code Playgroud)

对于nested_identifier这样的:

auto const nested_identifier_def =
        x3::lexeme[
                (+(id_string >> "::") >> +(id_string >> ".") > id_string)
                | (+(id_string >> "::") >> VEC_ATR > id_string)
                | (VEC_ATR >> +(id_string >> ".") > id_string)
                | identifier

        ];
Run Code Online (Sandbox Code Playgroud)

我知道这个宏让我感到羞耻.标识符解析器工作正常,但 nested_identifier有一个奇怪的行为,如果我尝试解析像foo::bar::baz落在了解析器的AST对象,拥有所有的命名空间,在这种情况下 …

c++ parsing boost-spirit boost-spirit-x3

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

内部编译器错误,同时使用boost spirit x3

我目前正在使用boost spirit X3为我的DSL实现表达式和运算符层次结构.

我认为我的解析器在语义上是正确的,但是当我尝试编译它时,在编译时,gcc和clang具有巨大的内存占用,编译了无限的时间,然后退出"g ++:内部编译器错误:已杀死(程序cc1plus) )".

我试图最小化表达式解析器的代码,但它不是那么简单

是一个演示.

有人能告诉我这里我做错了什么,或者这是一个错误?

编辑:我认为问题是那里的问题:

auto const idx = as<ast::Operation>(helper::idxaccess_op > expression > ']');
auto const func = as<ast::Operation>(helper::func_call_op > expression%',' > ')');
auto const data = as<ast::Operation>(helper::access_op > expression);

auto const func_call_expr_def =
    primary_expr >> *(idx|func|data);
Run Code Online (Sandbox Code Playgroud)

如果我(idx|func|data)改为(idx|func),它也会永久编译并使用高达16GB的ram,但gcc能够编译它,并且解析器的工作原理如何.

编辑二:请看看上面的链接有我的例子导致错误.

c++ boost-spirit c++14 boost-spirit-x3

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