用精神解析递归规则x3
Parsing recursive rules with spirit x3
我想解析以下解析简单模板类标识符的递归规则,如 foo<bar> foo<bar,baz> foo<bar<baz>>
这里是简单语法:
identifier := A-Z | a-z | _
class_identifier = identifier ?("<" identifier|class_identifier
( "," identifier|class_identifier)*
">")
我试过像这样用 x3 编写解析器:
auto const identifier = x3::rule<class identifier_id, std::string>{"identifier"}
= +x3::char_("A-Za-z");
x3::rule<class class_identifier, std::string> class_identifier = "class_identifier";
auto const class_identifier_def = identifier //classname
>> -(x3::string("<")
>> (identifier | class_identifier)
>> *(x3::string(",")
>> (identifier | class_identifier))
>> x3::string(">"));
BOOST_SPIRIT_DEFINE(class_identifier)
但是这个尝试无法解析像这样的东西 foo<bar<baz>>
但是 foo 没问题。
是我的语法有逻辑错误还是我用错了 boost spirit 因为这是一个递归规则?
我找到解析失败的原因了。我不得不将此 (identifier | class_identifier)
更改为此 (class_identifier | identifier)
,因为它也是 class_identifier
规则也以 identifier
开头。这就是为什么它每次都尝试使用 identifier
规则进行解析,然后在 <
处失败
我想解析以下解析简单模板类标识符的递归规则,如 foo<bar> foo<bar,baz> foo<bar<baz>>
这里是简单语法:
identifier := A-Z | a-z | _
class_identifier = identifier ?("<" identifier|class_identifier
( "," identifier|class_identifier)*
">")
我试过像这样用 x3 编写解析器:
auto const identifier = x3::rule<class identifier_id, std::string>{"identifier"}
= +x3::char_("A-Za-z");
x3::rule<class class_identifier, std::string> class_identifier = "class_identifier";
auto const class_identifier_def = identifier //classname
>> -(x3::string("<")
>> (identifier | class_identifier)
>> *(x3::string(",")
>> (identifier | class_identifier))
>> x3::string(">"));
BOOST_SPIRIT_DEFINE(class_identifier)
但是这个尝试无法解析像这样的东西 foo<bar<baz>>
但是 foo 没问题。
是我的语法有逻辑错误还是我用错了 boost spirit 因为这是一个递归规则?
我找到解析失败的原因了。我不得不将此 (identifier | class_identifier)
更改为此 (class_identifier | identifier)
,因为它也是 class_identifier
规则也以 identifier
开头。这就是为什么它每次都尝试使用 identifier
规则进行解析,然后在 <