C++ 用spiritx3解析递归规则

C++ 用spiritx3解析递归规则,c++,parsing,c++14,boost-spirit,boost-spirit-x3,C++,Parsing,C++14,Boost Spirit,Boost Spirit X3,我想解析以下递归规则,该规则解析简单模板类标识符,如foo foo foo,下面是简单语法: identifier := A-Z | a-z | _ class_identifier = identifier ?("<" identifier|class_identifier ( "," identifier|class_identifier)* "&

我想解析以下递归规则,该规则解析简单模板类标识符,如
foo foo foo
,下面是简单语法:

identifier := A-Z | a-z | _
class_identifier = identifier ?("<" identifier|class_identifier 
                                    ( "," identifier|class_identifier)* 
                                ">") 
标识符:=A-Z | A-Z |_
类\标识符=标识符?(“”)
我试图用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)
auto const identifier=x3::规则{“identifier”}
=+x3::char_uz(“A-Za-z”);
x3::规则class\u identifier=“class\u identifier”;
auto const class_identifier_def=标识符//类名
>>-(x3::字符串(“”);
增强精神定义(类标识符)
但是这种尝试无法解析像这样的
foo
但是foo很好。
我的语法中是否存在一些逻辑错误,或者由于这是一个递归规则,我使用的boost spirit是否有误?

我已经找到了这无法解析的原因。我必须将此
(标识符|类标识符)
更改为此
(类标识符|标识符)
,因为
类标识符
规则也以
标识符
开头。这就是为什么它每次都试图用
标识符
规则解析,但在
时失败了,我相信
(identifier | class_identifier)>*(x3::string(“,”)>>(标识符|类标识符))
可以替换为
(标识符|类标识符)%x3::string(“,”)
。如果可以将其简化为
%'、“
”,以及文字不会干扰运算符重载的其他位置,我也不会感到惊讶<代码>%,“
很好,即使我将其解析为一个字符串并希望
”,“
位于字符串中?@Exagon确实不是这样。在列表运算符中的分隔符解析器周围有一个隐式的
x3::omit[]
。我认为当前从未采用替代解析器的第二个分支。我还没有测试它,所以我可能是错的,但我很确定,只要您在
类中有可选的标识符,您甚至不需要替代运算符。如果将来更改属性(从普通字符串更改为某种AST),则当前的定义会更好(删除该选项)。