如何在EBNF中表示至少一次重复?

时间:2019-04-11 09:24:37

标签: repeat ebnf

https://en.wikipedia.org/wiki/Extended_Backus–Naur_form

以上文章提到花括号表示任意次重复(包括零),而方括号表示最多重复1次。

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

我可以这样描述它:

production = nonterminal, { nonterminal };

但是我认为EBNF优于BNF的目的是避免这种“ hacks”的需要。

Wikipedia文章还提到:

  

除其他事项外,EBNF还提供了语法来描述(指定次数)重复,排除部分生成内容并在EBNF语法中插入注释。

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

1 个答案:

答案 0 :(得分:1)

在最后一个花括号后放置一个减号(符号除外)。

production = { nonterminal }-;

ISO / IEC 14977:1996(E)

  

5.8语法术语

     

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

     

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

     

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

     

b)它不是由   句法例外。

     

作为示例,以下语法规则说明了这些功能   由例外符号提供。

     

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

     

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

     

字母:A B C D E F G H I J等。
  元音:A E I O U
  辅音:B C D F G H J K L M等。
  ee:AE AAE AAAE AAAAE AAAAAE等。

     

注意— {“ A”}-代表一个或多个A的序列,因为它是一个   空句法例外的句法项。

请注意,在第二段中(强调),满足两个条件。也就是说,必须同时满足 syntactic-factor syntactic-exception 。大括号仍然意味着重复。即使异常为空,也会导致一个或多个满足语法要求。