你能修改这个BNF语法,总是包含奇数狗吗?
<pets> ::= <pets> <pet> | <pet>
<pet> ::= dog | cat
'宠物'的例子:
dog cat
cat dog
dog dog dog
dog dog cat cat dog
dog cat dog dog
不是'宠物'的例子:
cat
dog cat dog
cat cat
答案 0 :(得分:4)
您希望在概念上拥有状态机。你处于两种状态之一:你看过奇数狗,或者你看过偶数只狗。
尝试:
// 0 or more cats
<cats> ::= cat <cats> | ""
// 1 dog possibly surrounded by cats
<one_dog> ::= <cats> dog <cats>
<even_dogs> ::= <one_dog> <one_dog> <even_dogs> | <cats>
<odd_dogs> ::= <even_dogs> <one_dog>
它可以使用一些清理,但它应该工作。需要注意的关键是&lt;猫&gt;并且不会反对。唯一必须拥有令牌的生产是&lt; one_dog&gt;。