如何表示 EBNF 中的至少一个重复?

5 repeat ebnf

https://en.wikipedia.org/wiki/Extended_Backus\xe2\x80\x93Naur_form

\n\n

上面的文章提到,大括号表示重复任意次(包括零次),而方括号表示最多重复一次。

\n\n

然而,我想要的是至少一次重复 - 也就是说,终端或非终端必须至少出现一次。

\n\n

好吧,我可以这样描述:

\n\n
production = nonterminal, { nonterminal };\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我认为 EBNF 相对于 BNF 的意义在于避免这种“黑客”的需要。

\n\n

维基百科文章还提到:

\n\n
\n

除其他外,EBNF 还提供了描述重复(指定次数)、排除产生式的某些部分以及在 EBNF 语法中插入注释的语法。

\n
\n\n

但是 EBNF 是否提供了描述至少一次重复的语法?

\n

Ric*_*ith 4

在最后一个大括号后面放置一个减号(例外符号)。

\n\n
production = { nonterminal }-;\n
Run Code Online (Sandbox Code Playgroud)\n\n

ISO/IEC 14977:1996(E)

\n\n
\n

5.8 句法术语

\n\n

当句法术语是单个句法因素时,它表示由该句法因素表示的任何符号序列。

\n\n

当句法术语是一个句法因子,后跟一个 except-符号,后跟一个句法异常时,它表示满足这两个条件的任何符号序列:

\n\n

a) 它是由句法因子表示的符号序列,

\n\n

b) 它不是由句法异常表示的符号序列。

\n\n

作为示例,以下语法规则说明了 except 符号提供的功能。

\n\n

字母=“A”| “B”| “C”| “D”| “E”| “F”
\n | “G”| “H”| “我”| “J”| “K”| “L”| “M”
\n| “N”| “哦” | “P”| “问”| “R”| “S”| “T”
\n| “你”| “V”| “W”| “X”| “是” | “Z”;
\n 元音 = "A" | “E”| “我”| “O”|“U”;
\n 辅音 = 字母 - 元音;
\n ee = {"A"}-, "E";

\n\n

这些规则定义的终端字符串如下:

\n\n

字母:ABCDEFGHIJ 等
\n 元音:AEIOU
\n 辅音:BCDFGHJKLM 等
\n ee:AE AAE AAAE AAAAE AAAAAE 等

\n\n

注意 \xe2\x80\x94 {"A"}- 表示一个或多个 A\xe2\x80\x99 的序列,因为它是一个具有空语法异常的语法术语。

\n
\n\n

请注意,在第二段中(添加了强调),满足两个条件。也就是说,必须同时满足句法因素句法例外。大括号仍然意味着重复。这会导致一个或多个满足语法的情况,即使异常为空。

\n