期待 char_ 解析器的序列和交替来合成一个字符串
Expecting sequences and alternations of char_ parsers to synthesize a string
在下面的测试用例中,一个 alpha 和一个序列的交替出现了一个长错误转储,基本上说 static assertion failed: The parser expects tuple-like attribute type
。直觉上,我希望整个规则产生一个字符串,但事实并非如此。我要么必须将交替的左侧更改为 +alpha
(制作两侧向量),要么走语义动作的路径,至少对于交替中的单独字符(附加到 _val)。或者,将单独的左侧 char_
更改为 string
。无论如何,我无法弄清楚解析像这样微不足道的字符串的正确简单方法是什么,感谢任何提示。 TIA.
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
namespace grammar {
using x3::char_;
using x3::alpha;
using x3::xdigit;
const auto x =
x3::rule< struct x_class, std::string > { "x" } =
char_('/') > alpha >> *(alpha | (char_('#') > xdigit));
} // namespace grammar
int main () {
std::string input{ "/Foobar#F" }, attr;
auto iter = input.begin ();
if (phrase_parse (iter, input.end (), grammar::x, x3::space, attr)) {
std::cout << attr << std::endl;
}
return 0;
}
我也讨厌这种行为。齐在这方面就自然多了。
老实说,我并不总是知道如何 "fix" 虽然
- 在这种情况下,您似乎可以使用
raw[]
- 也可以简化语法
- 有时避免混淆
operator>
和 operator>>
会有所帮助
以下是我为您的语法所做的工作:
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
namespace grammar {
const auto x =
x3::rule<struct x_class, std::string> { "x" } =
x3::raw [ '/' > x3::alpha >> *(x3::alpha | ('#' > x3::xdigit)) ];
}
int main () {
std::string input{ "/Foobar#F" }, attr;
auto iter = input.begin ();
if (phrase_parse (iter, input.end (), grammar::x, x3::space, attr)) {
std::cout << attr << std::endl;
}
}
版画
/Foobar#F
在下面的测试用例中,一个 alpha 和一个序列的交替出现了一个长错误转储,基本上说 static assertion failed: The parser expects tuple-like attribute type
。直觉上,我希望整个规则产生一个字符串,但事实并非如此。我要么必须将交替的左侧更改为 +alpha
(制作两侧向量),要么走语义动作的路径,至少对于交替中的单独字符(附加到 _val)。或者,将单独的左侧 char_
更改为 string
。无论如何,我无法弄清楚解析像这样微不足道的字符串的正确简单方法是什么,感谢任何提示。 TIA.
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
namespace grammar {
using x3::char_;
using x3::alpha;
using x3::xdigit;
const auto x =
x3::rule< struct x_class, std::string > { "x" } =
char_('/') > alpha >> *(alpha | (char_('#') > xdigit));
} // namespace grammar
int main () {
std::string input{ "/Foobar#F" }, attr;
auto iter = input.begin ();
if (phrase_parse (iter, input.end (), grammar::x, x3::space, attr)) {
std::cout << attr << std::endl;
}
return 0;
}
我也讨厌这种行为。齐在这方面就自然多了。
老实说,我并不总是知道如何 "fix" 虽然
- 在这种情况下,您似乎可以使用
raw[]
- 也可以简化语法 - 有时避免混淆
operator>
和operator>>
会有所帮助
以下是我为您的语法所做的工作:
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
namespace grammar {
const auto x =
x3::rule<struct x_class, std::string> { "x" } =
x3::raw [ '/' > x3::alpha >> *(x3::alpha | ('#' > x3::xdigit)) ];
}
int main () {
std::string input{ "/Foobar#F" }, attr;
auto iter = input.begin ();
if (phrase_parse (iter, input.end (), grammar::x, x3::space, attr)) {
std::cout << attr << std::endl;
}
}
版画
/Foobar#F