尝试学习提振 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/