【发布时间】:2018-03-04 20:13:19
【问题描述】:
以下用于简单机器人命令语言的 Spirit x3 语法会在 Windows Visual Studio 17 中生成编译器错误。对于此项目,我需要在警告级别为 4 (/W4) 的情况下进行编译,并将警告视为错误 (/WX )。
警告 C4127 条件表达式为 常量 SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\char\detail\cast_char.hpp 29
错误 C2039“插入”:不是 'boost::spirit::x3::unused_type' SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\core\detail\parse_into_container.hpp 259 错误 C2039 'end': is not a member of 'boost::spirit::x3::unused_type' SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\core\detail\parse_into_container.hpp 259 错误 C2039 'empty': is not a member of 'boost::spirit::x3::unused_type' SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\core\detail\parse_into_container.hpp 254 错误 C2039 'begin': is not a member of 'boost::spirit::x3::unused_type' SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\core\detail\parse_into_container.hpp 259
显然,我的语法有问题,但错误消息完全没有帮助。我发现如果我删除语法最后一行中的 Kleene 星(* 参数到只是参数),错误就会消失,但是我会收到很多这样的警告:
“数字”的警告 C4459 声明隐藏全局 声明 SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\support\numeric_utils\detail\extract_int.hpp 174 警告 C4127 条件表达式为常量 SpiritTest e:\data\boost\boost_1_65_1\boost\spirit\home\x3\char\detail\cast_char.hpp 29
#include <string>
#include <iostream>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
//
// Grammar for simple command language
//
namespace scl
{
using boost::spirit::x3::char_;
using boost::spirit::x3::double_;
using boost::spirit::x3::int_;
using boost::spirit::x3::lexeme;
using boost::spirit::x3::lit;
using boost::spirit::x3::no_case;
auto valid_identifier_chars = char_ ("a-zA-Z_");
auto quoted_string = '"' >> *(lexeme [~char_ ('"')]) >> '"';
auto keyword_value_chars = char_ ("a-zA-Z0-9$_.");
auto qual = lexeme [!(no_case [lit ("no")]) >> +valid_identifier_chars] >> -('=' >> (quoted_string | int_ | double_ | +keyword_value_chars));
auto neg_qual = lexeme [no_case [lit ("no")] >> +valid_identifier_chars];
auto qualifier = lexeme ['/' >> (qual | neg_qual)];
auto verb = +valid_identifier_chars >> *qualifier;
auto parameter = +keyword_value_chars >> *qualifier;
auto command = verb >> *parameter;
}; // End namespace scl
using namespace std; // Must be after Boost stuff!
int
main ()
{
vector <string> input =
{
"show/out=\"somefile.txt\" motors/all cameras/full",
"start/speed=5 motors arm1 arm2/speed=2.5/track arm3",
"rotate camera1/notrack/axis=y/angle=45"
};
//
// Parse each of the strings in the input vector
//
for (string str : input)
{
auto b = str.begin ();
auto e = str.end ();
cout << "Parsing: " << str << endl;
x3::phrase_parse (b, e, scl::command, x3::space);
if (b != e)
{
cout << "Error, only parsed to position: " << b - str.begin () << endl;
}
} // End for
return 0;
} // End main
【问题讨论】:
-
如果骗子不是骗子,请告诉我。很可能是这样。您可以通过提供兼容属性而不是课程来“修复”它
-
@sehe,我看不出它是如何递归的。一个动词可以有零个或多个限定词,动词可以有零个或多个形参,每个形参有零个或多个限定词
-
这个问题与递归规则无关 - 它只是在标题中出现,因为它是触发库错误的原因。
-
今晚晚些时候我会解决的。中途在这里排练
-
那里。正如我提到的,这完全是重复的,但我充实了一个解释。我通过复习语法并通过演示 Ast 完成它,使解释更有价值。
标签: c++ boost boost-spirit boost-spirit-x3