尝试学习提振 spirit ,文档中给出的示例让我有些困惑。

引用此代码:

http://www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/roman.cpp

特别是这部分语法:

        start = eps             [_val = 0] >>
            (
                +lit('M')       [_val += 1000]
                ||  hundreds    [_val += _1]
                ||  tens        [_val += _1]
                ||  ones        [_val += _1]
            )

有人可以向我解释为什么它是+ lit('M')而不是* lit('M')。因为毕竟不能有零个或多个M,而不是一个或多个M?

最佳答案

+lit('M')*lit('M')都是正确的。但在我看来,前者比后者更具可读性(在语义上),因为前者说如果存在1000匹配项,则将 _val添加到one中,然后重复进行。另一方面,后者很难读取,因为即使对于零匹配,也可以将其读取为 1000添加到_val中。零时间匹配未将1000添加到_val中,但解析器*lit('M')似乎也针对零匹配而匹配(似乎有点令人困惑)。

因此,+lit('M')是可取的。

好的。我读了你的评论。 CCLLIX不是有效的罗马数字。您认为它的值(value)是什么? 309?如果是这样,那么CCCIX的值是多少?它也是309,它是正确的。你错了因此,当您使用*lit('M')时,解析器将停止。还要注意,即使您为这个错误的输入使用+lit('M'),解析器也将停止。

关于c++ - Boost Spirit罗马数字解析器示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7179502/

10-11 23:05