如何将BNF转换为EBNF

Des*_*ara 6 bnf ebnf

如何将此BNF转换为EBNF?

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 10

EBNF或Extended Backus-Naur表格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
Run Code Online (Sandbox Code Playgroud)

*操作者使用具有前述(无符号)的整数; 它似乎不允许可变数量的重复 - 例如在初始字符之后的1-15个字符,以使标识符长达16个字符.这是lis

在标准中,左括号(称为起始组符号,而右括号)称为结束组符号 ; 开放方括号[开始选项符号,右方括号是结束选项符号 ; 开括号{开始重复符号,闭括号}结束重复符号.单引号'被称为第一次报价符号和双引号"第二次试举象征.

*是的,免费 - 即使您愿意也可以支付74瑞士法郎.查看包含收费项目的框下的注释.


该问题旨在将此"BNF"转换为EBNF:

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
Run Code Online (Sandbox Code Playgroud)

BNF没有正式定义,所以我们必须做一些(简单)猜测它意味着什么.翻译是常规的(如果正式定义BNF,它可能是机械的):

vardec     = 'var', vardeclist, ';';
vardeclist = varandtype, { ';', varandtype };
varandtype = ident, { ',', ident }, ':', typespec;
ident      = letter, { idchar };
idchar     = letter | digit | '_';
Run Code Online (Sandbox Code Playgroud)

必须在非端子周围移除尖角; 定义符号::=被替换为=; 端子如;_括在报价; 连接明确标有,; 并且每条规则都以;.原始的分组和替代操作恰好与标准符号一致.注意,用逗号显式连接意味着多字非终端是明确的.


对标准本身的{...}-随意研究表明,符号不是本文标准的一部分.但是,正如jmmut评论中指出的那样,该标准确实定义了以下含义{…}-:

§5.8句法术语

...

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

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

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

...

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


Mik*_*rov 2

删除尖括号并将所有端子放入引号中:

vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"
Run Code Online (Sandbox Code Playgroud)

  • 初步近似;有一些细节需要修改。 (4认同)