如何将BNF转换为EBNF

  • 本文关键字:EBNF 转换 BNF bnf ebnf
  • 更新时间 :
  • 英文 :


如何将此BNF转换为EBNF?

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _

EBNF或Extended Backus Naur Form是ISO 14977:1996,可从ISO免费获得PDF格式的*。它没有被计算机语言标准广泛使用。还有一篇论文对其进行了描述,该论文包含了一张总结EBNF符号的表格。

         Table 1: Extended BNF
Extended BNF    Operator  Meaning
-------------------------------------------------------------
unquoted words            Non-terminal symbol
" ... "                   Terminal symbol
' ... '                   Terminal symbol
( ... )                   Brackets
[ ... ]                   Optional symbols
{ ... }                   Symbols repeated zero or more times
{ ... }-                  Symbols repeated one or more times†
=               in        Defining symbol
;               post      Rule terminator
|               in        Alternative
,               in        Concatenation
-               in        Except
*               in        Occurrences of
(* ... *)                 Comment
? ... ?                   Special sequence

*运算符用于前面的(无符号)整数;它似乎不允许可变数量的重复,例如在初始字符之后的1-15个字符使标识符的长度达到16个字符。这是

在标准中,左括号(被称为起始组符号,右括号)被称为结束组符号;开方括号[开始选项符号,闭方括号是结束选项符号;大括号{开始重复符号,而闭括号}结束重复符号。单引号'称为第一个引号,双引号"称为第二个引号

*是的,免费——尽管如果你愿意,你也可以为此支付74瑞士法郎。看一下装有收费项目的盒子下面的纸条


这个问题试图将这个"BNF"转换为EBNF:

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _

BNF没有正式定义,所以我们必须对它的含义进行一些(简单的)猜测。翻译是例行的(如果BNF被正式定义,它可能是机械的):

vardec     = 'var', vardeclist, ';';
vardeclist = varandtype, { ';', varandtype };
varandtype = ident, { ',', ident }, ':', typespec;
ident      = letter, { idchar };
idchar     = letter | digit | '_';

必须拆除非端子周围的角支架;定义符号CCD_ 9被CCD_;诸如CCD_ 11和CCD_;级联被明确地标记为CCD_ 13;并且每个规则以CCD_ 14结束。原件中的分组和替换操作恰好与标准符号一致。请注意,使用逗号的显式连接意味着多词非词尾是明确的。


对标准本身的随意研究表明,{...}-符号不是标准的一部分,只是论文的一部分。然而,正如jmmut在评论中所指出的,该标准确实定义了{…}-:的含义

§5.8句法术语

当一个句法术语是一个句法因素,后面跟着后跟语法异常it的except符号表示同时满足以下条件的任何符号序列条件:

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

b) 它不是由句法异常。

注:{ "A" } -表示一个或多个a的序列,因为它是一个具有空句法异常的句法术语。

去掉尖括号,将所有终端放在引号中:

vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"

最新更新