你能修改这个BNF语法,总是包含奇数狗吗?

时间:2011-01-07 18:01:55

标签: parsing syntax bnf

你能修改这个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

1 个答案:

答案 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;。