如何将此BNF转换为EBNF?
<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
答案 0 :(得分:10)
EBNF或Extended Backus-Naur Form为ISO 14977:1996,可从ISO获取免费 * 的PDF格式。它没有被计算机语言标准广泛使用。还有一个描述它的paper,该文件包含了总结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个字符。这是lis
在标准中,左括号(
称为起始组符号,而右括号)
称为结束组符号;开方括号[
是开始选项符号,关闭方括号是结束选项符号;左大括号{
是开始重复符号,大括号}
是结束重复符号。单引号'
称为第一个引号符号,双引号"
是第二个引号符号。
*是的,免费 - 即使您愿意也可以支付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 | '_';
必须在非端子周围移除尖括号;定义符号::=
由=
替换; ;
和_
等终端用引号括起来;连接用,
明确标记;并且每个规则都以;
结束。原始的分组和替代操作恰好与标准符号一致。请注意,使用逗号显式连接意味着多字非终端是明确的。
†对标准本身的随意研究表明{...}-
符号不是本文标准的一部分。但是,正如jmmut中的comment注释,该标准确实定义了{…}-
的含义:
§5.8句法术语
...
当句法术语是句法因子后跟着 除了符号后跟一个句法异常它 表示满足两者的任何符号序列 条件:
a)它是由句法因子
表示的符号序列b)它不是由...表示的符号序列 句法的异常。
...
注意 -
{ "A" } -
代表一个或多个A的序列,因为它是一个具有空语法异常的句法术语。
答案 1 :(得分:0)
删除尖括号并将所有终端放入引号:
vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"