逗号分隔序列的BNF是什么?

9

不能为由逗号分隔的字符序列(可能为空),但不以逗号开头或结尾提供BNF语法,

所以这没问题:

  <--- Empty sequence is ok!
A
A,B
A,B,C

这是不正确的:
A,
,A
A,,B
AB

空情况让我感到困扰。目前我的理解是:
<char-seq> ::= <empty> | <char> , <char-seq> | <char>

但是这样会产生像 A, 这样的字符串 :-(。
2个回答

13

空的字符序列是导致问题的原因。您需要编写一个匹配非空序列的规则,与同时匹配空和非空序列的规则分开,像这样:

<char-seq> ::= <empty> | <non-empty-char-seq>
<non-empty-char-seq> ::= <char> | <char> , <non-empty-char-seq>

谢谢你的解决方案,但我认为这个BNF是无限递归的?应该像这样:<non-empty-char-seq> ::= /empty/|<char> | <char>,<non-empty-char-seq>,我是对的吗? - Melih Altıntaş
1
@MelihAltıntaş,“<empty>”是由“<char-seq>”允许的,但不被“<non-empty-char-seq>”所允许,后者必须以字符开头和结尾。 - Sergey Kalinichenko

4
<char-seq> ::= <empty> | <chars>
<chars> ::= <char> | <char> , <chars>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接