【问题标题】:Parsing hexadecimal and binary numbers解析十六进制和二进制数
【发布时间】:2023-03-15 04:11:01
【问题描述】:

我正在使用 boost spirit 来解析一些复杂的表达式,例如“0b111

            ............
            factor =
            num                                  [ qi::_val =    qi::_1  ]
            |   '('  >> expr                     [ qi::_val =    qi::_1  ] >>')'
            |   '-'  >> num                      [ qi::_val =   -qi::_1  ]
            |   '+'  >> num                      [ qi::_val =    qi::_1  ]
            |   '~'  >> num                      [ qi::_val =   ~qi::_1  ]
            ;


            num =
            qi::uint_                           [ qi::_val =    qi::_1  ]
            |   hexOrBinNum                     [  qi::_val =   qi::_1  ]
            ;


            hexOrBinNum =
            "0x"    >>    qi::int_parser<int, 16>{}        [ qi::_val =    qi::_1  ]
            |   "0b" >>    qi::int_parser<int, 2>{}         [ qi::_val =    qi::_1  ]
            ;

【问题讨论】:

标签: c++ parsing binary hex boost-spirit


【解决方案1】:

找到了答案,只是替换了这行

        num =
        qi::uint_                           [ qi::_val =    qi::_1  ]
        |   hexOrBinNum                     [  qi::_val =   qi::_1  ]
        ;

        num =
        hexOrBinNum                       [  qi::_val =   qi::_1  ]
        |   qi::uint_                     [  qi::_val =   qi::_1  ]
        ;

【讨论】:

  • 你能解释一下吗?
  • 当然,主要是优先级和歧义。因此,如果解析器将找到 num 标记,它应该下降到 hexOrBinNum 标记(具有更高的优先级),然后下降到最后一个术语。有关更多信息,请查看 flex 和 bison 书(歧义语法,第 14 页)
  • 我的意思是改进你的答案。正如您会注意到,如果您按照链接进行操作,我确实知道这是如何工作的。但是,如果您想让 Q&A 对任何人(除了您)有用,您可能应该在回答中解释它。我们不是在谈论 Flex/Bison。在 Spirit 的解析器表达式中,原因不是优先级或歧义。原因是PEG parsers
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 2014-10-30
  • 2023-03-22
  • 1970-01-01
  • 2018-08-26
  • 2010-12-30
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多