我怎么能转换这个BNF到EBNF?
<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
我怎么能转换这个BNF到EBNF?
<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
EBNF或扩展巴科斯范式是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个字符长。 这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在笔记注释 ,标准确实定义的含义{…}-
§5.8句法项
...
当句法术语是一个句法因子随后是除符号接着是句法例外它表示满足两个条件的符号的任意序列:
一个)它是由句法因子表示符号的序列,
b)中它不是由句法的异常表示符号的序列。
...
注-
{ "A" } -
代表的序列的一个或多个A的,因为它是一个语法长期与空句法例外。
删除尖括号,并把所有的终端到报价:
vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"