在尝试解决编程语言科目中的以下练习时,我知道我的答案无法创建字符串201,但我无法想象如何解决此异常。
问题:L(G)是一组正十进制数,除0以外不以0开头。设计语法G.
我的回答:
G is:
S -> Digit
NonZeroDigit -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Digit -> 0 | NonZeroDigit | NonZeroDigit 0 | NonZeroDigit Digit
检查正确性:
Digit => 0
Digit => NonZeroDigit => 1
Digit => NonZeroDigit Digit => 2 Digit => 20
如果我添加Digit -> Digit Digit
,则会创建Digit => Digit Digit => Digit Digit Digit => 201
,但这也可以创建Digit => Digit Digit => Digit Digit Digit => 000
。什么?
如何更改我定义的语法,以便符合条件?
答案 0 :(得分:1)
为什么不拆分n = 0和n> 0?
S -> 0 | posDig digit
posDig -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
digit -> digit digit | 0 | posDig | <epsilon>
而不是S中的(posDig数字),你也可以说,例如数字(从1到9现在也是一个数字) 从那以后,你只需要确保第一个数字不是