我正在尝试找出解析以下文本的方式
function() {body ...}
function(args_) {body...}
我应该对两个变体使用相同的结构,还是只使用一个结构
struct function
{
std::string name_;
std::vector<std::string> args_;
statement_list body_;
};
我现在解析它的方式(如果没有参数,如何跳过参数):
auto const identifier_def = raw[lexeme[(alpha | '_') >> *(alnum | '_')]];
auto const function_def =
lexeme["function" >> !(alnum | '_')] >> identifier
>> '(' >> ((identifier % ',') )>> ')'
>> '{' >> statement >> '}'
;
我可以解析带有参数的变体,但不能解析没有参数的那个!
我正在尝试使用类似OR运算符的方法,但是没有成功。
谢谢!
答案 0 :(得分:2)
作为一个简短的提示,通常可以正常工作:
>> '(' >> -(identifier % ',') >> ')'
根据特定类型(尤其是identifier
的声明),您可能会进行如下调整:
>> '(' >> (-identifier % ',') >> ')'
强迫它的想法:
x3::rule<struct arglist_, std::vector<std::string> > { "arglist" }
= '(' >> (
identifier % ','
| x3::attr(std::vector<std::string> ())
)
>> ')';