用精神x3解析递归规则

时间:2016-05-26 16:35:53

标签: c++ parsing c++14 boost-spirit boost-spirit-x3

我想解析下面的重用规则,解析简单的模板classe标识符,如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很好。 我的语法中是否存在某些逻辑错误,或者我使用提升精神错误,因为这是一个递归规则?

1 个答案:

答案 0 :(得分:3)

我发现为什么无法解析。我希望将此(identifier | class_identifier)更改为此(class_identifier | identifier),因为class_identifier规则也以identifier开头。这就是为什么它尝试使用identifier规则每次解析然后在<

失败