我正在尝试用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
我想知道是否有办法将 an 绑定ObservableSet到 aListView 或ObservableList双向绑定到 an ObservableSet?
我正在尝试编写一个解析器,它解析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
这是一个现场演示
为什么这个解析器在双打时失败?
我正在尝试学习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中的一个错字.
我试图编写一个类似于 Java 的Matcher::replaceFirst(String replacement). 我知道如何更换所有比赛中std::string,有std::regex_replace,但我怎么能只替换字符串中的正则表达式的第一场比赛?
如何使用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向量中,那将是很好的.
我正在努力编写一个标识符解析器,它解析一个不是关键字的字母字符串。关键字都在一个表中:
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解析器无法解析此字符串。我怎样才能让这个解析器正确?
我正在阅读语言vala,它编译成Ansi C代码.但是我也看到它支持Java或Rust等泛型.现在我的问题是如何将其编译为C代码?如果我有一个泛型类或函数,生成什么样的C代码来模拟通用行为?
我有一个用于解析标识符的解析器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对象,拥有所有的命名空间,在这种情况下 …
我目前正在使用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能够编译它,并且解析器的工作原理如何.
编辑二:请看看上面的链接有我的例子导致错误.