Boost Spirit 电子邮件地址解析器属性生成

Boost Spirit email address parser attribute generation

我正在编写一个包含解析电子邮件地址规则的语法。 规则声明为:

qi::rule<Iterator, ascii::space_type, std::string()> email;

它的定义是:

email 
   =
      qi::lexeme[
          +ascii::alnum 
          >> *(qi::char_(".") >> +ascii::alnum) 
          >>  qi::char_("@") 
          >> +ascii::alnum 
          >> +(qi::char_(".") >> +ascii::alnum)
      ]

当我使用此语法解析文本时,解析器正确匹配了电子邮件地址,但规则的综合属性与正确的地址不对应。例如,如果文本包含地址 info.it@example.com,则合成属性为 info.@example。我认为这是由于 kleen 和 plus 运算符。

我正在使用 boost 1.48,我已经用 boost 1.54 测试了代码,在那个版本中它工作正常,但不幸的是我无法在我的项目中升级到它。

我可以解决这个问题吗,也许使用语义操作?

有意思。

我想这与容器属性如何通过后续容器处理解析器表达式附加到有关。

我不打算安装该库版本,但您可以执行以下操作:

NOTE

  • your pattern is not for general email addressing. This is much more complicated in reality. I'm assuming your rule is right for your internal requirements.

  • Your rule doesn't allow .. anywhere, right? Assuming this is on purpose too

  • Your rule doesn't start . at the start or end of a substring either. Assuming this is on purpose too

  1. 删除船长,因为整个规则是一个词位:(参见 Boost spirit skipper issues

    qi::rule<Iterator, std::string()> email;
    
    email =
            +ascii::alnum
            >> *(qi::char_(".") >> +ascii::alnum)
            >>  qi::char_("@")
            >> +ascii::alnum
            >> +(qi::char_(".") >> +ascii::alnum)
            ;
    
  2. 现在,使用 raw[]as_string[] 来收集整个输入:

    qi::rule<Iterator, std::string()> email;
    
    email = qi::as_string [
        +ascii::alnum
        >> *(qi::char_(".") >> +ascii::alnum)
        >>  qi::char_("@")
        >> +ascii::alnum
        >> +(qi::char_(".") >> +ascii::alnum)
    ];
    
  3. 使用raw[]你甚至不需要属性捕获使规则更有效和更简单:

    qi::rule<Iterator, std::string()> email;
    
    email = qi::raw [
           +ascii::alnum >> *('.' >> +ascii::alnum)
        >> '@'
        >> +ascii::alnum >> +('.' >> +ascii::alnum)
    ];