7

如何将此 BNF 转换为 EBNF?

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

2 回答 2

12

EBNF 或Extended Backus-Naur FormISO 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 | '_';

必须去除非端子周围的尖括号;定义符号::=替换为=; 终端如;_用引号括起来;连接用,;明确标记 并且每条规则都以;. 原始中的分组和替代操作恰好与标准符号一致。请注意,与逗号的显式连接意味着多词非终结符是明确的。


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

§5.8 句法术语

…</p>

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

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

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

…</p>

注意 -{ "A" } -表示一个或多个 A 的序列,因为它是一个带有空句法异常的句法项。

于 2013-02-17T15:43:29.843 回答
2

删除尖括号并将所有终端放在引号中:

vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"
于 2013-02-17T14:46:54.070 回答