- 浏览: 673685 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zhouyicang:
为嘛人气不够,这么好的文章,我找了几十篇博客,才找到这篇解惑了 ...
HTML 块级元素/内联元素 -
young7:
不错,解惑了
HTML 块级元素/内联元素 -
lvjin948:
获取浏览器语言的完美方案。http://blog.csdn.n ...
JavaScript获取浏览器语言类型 -
tarena_hhh:
我用了css优化工具,发现他的顺序有很大不一样?????
CSS属性书写顺序及命名规则 -
deng131:
谢谢你的提醒,是有个地方写错了
javascript事件绑定addEventListener,attachEvent
巴科斯范式
巴科斯范式(也称为巴科斯-瑙尔范式、巴克斯-诺尔范式)即 BNF 是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于程序设计语言、指令集、通信协议的语法表示中。大多数程序设计语言或者形式语义方面的教科书都采用巴科斯范式。在各种文献中还存在巴科斯范式的一些变体,如扩展巴科斯范式EBNF或扩充巴科斯范式 ABNF。
BNF 规定是推导规则(产生式)的集合,写为:
<code><符号> ::= <使用符号的表达式>
这里的<符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠 ‘|’ 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。
扩展巴科斯范式
扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式 (BNF)元语法符号表示法的一种扩展。
它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。
基本
代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。
EBNF 定义了把各符号序列分别指派到非终结符的产生规则:
digit excluding zero = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
digit = "0" | digit excluding zero ;
这个产生规则定义了在这个指派的左端的非终结符 digit。竖杠表示可供选择,而终结符被引号包围,最后跟着分号作为终止字符。所以 digit 是一个 0 或可以是 1 或 2 或 3 直到 9 的一个 digit excluding zero。
产生规则还可以包括由逗号分隔的一序列终结符或非终结符:
twelve = "1" , "2" ;
two hundred one = "2" , "0" , "1" ;
three hundred twelve = "3" , twelve ;
twelve thousand two hundred one = twelve , two hundred one ;
可以省略或重复的表达式可以通过花括号 { … } 表示:
natural number = digit excluding zero , { digit } ;
在这种情况下,字符串 1, 2, …,10,…,12345,… 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。
可选项可以通过方括号 [ ... ] 表示:
integer = "0" | [ "-" ] , natural number ;
所以 integer 是一个零(0)或可能前导可选的负号的一个自然数。
EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。
依据 ISO 的扩展
依据 ISO 14977 标准,提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在问号包围内的任意文本,其解释超出了 EBNF 标准的范围。例如,空格字符可以用如下规则定义:
space = ? US-ASCII character 32 ?;
其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:
something = foo ( bar );
所以 EBNF 的扩展可以使用这种表示法。例如,在 Lisp 文法中,函数应用可以用如下规则定义:
function application = list( symbol , [ { expression } ] );
扩展 BNF 的动机
BNF 有着可选项和重复不能直接表达的问题。作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。
可选项:
signed number = [ sign , ] number ;
可按 BNF-风格定义为:
signed number = sign , number | number ;
或
signed number = optional sign , number ;
optional sign = ε | sign ; (* 使用 ε 来更清晰的指示空产生式 *)
重复:
number = { digit } ;
可按 BNF-风格定义为:
number = digit | number digit;
其他增加和修改
EBNF 排除了 BNF 的一些缺陷:
1. BNF 为自身使用了符号 (<, >, |, ::=)。当它们出现在要定义的语言中的时候,BNF 不能不加以修改或解释的使用。
2. BNF-语法在一行中只表示一个规则。
EBNF 解决了这些问题:
1. 终结符被严格的包围在引号 (“…” 或 ‘…’) 中。给非终结符的尖括号 (“<…>”)可以省略。
2. 通常使用终止字符分号结束一个规则。
进一步还提供了定义重复次数,排除法选择(比如除了引号的所有字符)和注释等的增强机制。
不管所有这些增强,EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。
EBNF 已经被ISO用代码 ISO/IEC 14977:1996(E) 标准化了。
在某些场合任何扩展的 BNF 都被称为 EBNF。例如 W3C 使用 one EBNF 来规定 XML。
另一个例子
只允许赋值的简单编程语言可以用 EBNF 定义为:
(* a simple program in EBNF − Wikipedia *)
program = 'PROGRAM' , white space , identifier , white space ,
'BEGIN' , white space ,
{ assignment , ";" , white space } ,
'END.' ;
identifier = alphabetic character , [ { alphabetic character | digit } ] ;
number = [ "-" ] , digit , [ { digit } ] ;
string = '"' , { all characters − '"' } , '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A"|"B"|"C"|"D"|"E"|"F"|"G"
|"H"|"I"|"J"|"K"|"L"|"M"|"N"
|"O"|"P"|"Q"|"R"|"S"|"T"|"U"
|"V"|"W"|"X"|"Y"|"Z" ;
digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
white space = ? white space characters ? ;
all characters = ? all visible characters ? ;
一个语法上正确的程序:
PROGRAM DEMO1
BEGIN
A0:=3;
B:=45;
H:=-100023;
C:=A;
D123:=B34A;
BABOON:=GIRAFFE;
TEXT:="Hello world!";
END.
这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。
使用了在标准中提议为正规表示的下列字符:
用途 符号表示
定义 =
串接 ,
终止 ;
分隔 |
可选 [ ... ]
重复 { … }
分组 ( … )
双引号 ” … “
单引号 ‘ … ‘
注释 (* … *)
特殊序列 ? … ?
除外 -
约定
1. 使用了如下约定:
1. 扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;
2. 结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。
2. 表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:
* repetition-symbol
- except-symbol
, concatenate-symbol
| definition-separator-symbol
= defining-symbol
; terminator-symbol
3. 下列括号对超越正常优先级:
' first-quote-symbol first-quote-symbol '
" second-quote-symbol second-quote-symbol "
(* start-comment-symbol end-comment-symbol *)
( start-group-symbol end-group-symbol )
[ start-option-symbol end-option-symbol ]
{ start-repeat-symbol end-repeat-symbol }
? special-sequence-symbol special-sequence-symbol ?
作为例子,下列语法规则展示了表达重复的设施:
aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "D";
这些规则定义的终结字符串如下:
aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: D AAAD AAAAAAD etc.
有关工作
1. W3C 使用一种不同的 EBNF 来指定 XML 语法。
2. British Standards Institute 在1981年出版了一个 EBNF 标准: BS 6154。
3. IETF 使用在 RFC 4234 中规定的扩充 BNF (ABNF)。
ps,由于中文维基百科尚不可访问,所以就原文转载了其中关于巴科斯范式和扩展巴科斯范式的词条。
巴科斯范式(也称为巴科斯-瑙尔范式、巴克斯-诺尔范式)即 BNF 是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于程序设计语言、指令集、通信协议的语法表示中。大多数程序设计语言或者形式语义方面的教科书都采用巴科斯范式。在各种文献中还存在巴科斯范式的一些变体,如扩展巴科斯范式EBNF或扩充巴科斯范式 ABNF。
BNF 规定是推导规则(产生式)的集合,写为:
<code><符号> ::= <使用符号的表达式>
这里的<符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠 ‘|’ 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。
扩展巴科斯范式
扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式 (BNF)元语法符号表示法的一种扩展。
它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。
基本
代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。
EBNF 定义了把各符号序列分别指派到非终结符的产生规则:
digit excluding zero = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
digit = "0" | digit excluding zero ;
这个产生规则定义了在这个指派的左端的非终结符 digit。竖杠表示可供选择,而终结符被引号包围,最后跟着分号作为终止字符。所以 digit 是一个 0 或可以是 1 或 2 或 3 直到 9 的一个 digit excluding zero。
产生规则还可以包括由逗号分隔的一序列终结符或非终结符:
twelve = "1" , "2" ;
two hundred one = "2" , "0" , "1" ;
three hundred twelve = "3" , twelve ;
twelve thousand two hundred one = twelve , two hundred one ;
可以省略或重复的表达式可以通过花括号 { … } 表示:
natural number = digit excluding zero , { digit } ;
在这种情况下,字符串 1, 2, …,10,…,12345,… 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。
可选项可以通过方括号 [ ... ] 表示:
integer = "0" | [ "-" ] , natural number ;
所以 integer 是一个零(0)或可能前导可选的负号的一个自然数。
EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。
依据 ISO 的扩展
依据 ISO 14977 标准,提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在问号包围内的任意文本,其解释超出了 EBNF 标准的范围。例如,空格字符可以用如下规则定义:
space = ? US-ASCII character 32 ?;
其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:
something = foo ( bar );
所以 EBNF 的扩展可以使用这种表示法。例如,在 Lisp 文法中,函数应用可以用如下规则定义:
function application = list( symbol , [ { expression } ] );
扩展 BNF 的动机
BNF 有着可选项和重复不能直接表达的问题。作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。
可选项:
signed number = [ sign , ] number ;
可按 BNF-风格定义为:
signed number = sign , number | number ;
或
signed number = optional sign , number ;
optional sign = ε | sign ; (* 使用 ε 来更清晰的指示空产生式 *)
重复:
number = { digit } ;
可按 BNF-风格定义为:
number = digit | number digit;
其他增加和修改
EBNF 排除了 BNF 的一些缺陷:
1. BNF 为自身使用了符号 (<, >, |, ::=)。当它们出现在要定义的语言中的时候,BNF 不能不加以修改或解释的使用。
2. BNF-语法在一行中只表示一个规则。
EBNF 解决了这些问题:
1. 终结符被严格的包围在引号 (“…” 或 ‘…’) 中。给非终结符的尖括号 (“<…>”)可以省略。
2. 通常使用终止字符分号结束一个规则。
进一步还提供了定义重复次数,排除法选择(比如除了引号的所有字符)和注释等的增强机制。
不管所有这些增强,EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。
EBNF 已经被ISO用代码 ISO/IEC 14977:1996(E) 标准化了。
在某些场合任何扩展的 BNF 都被称为 EBNF。例如 W3C 使用 one EBNF 来规定 XML。
另一个例子
只允许赋值的简单编程语言可以用 EBNF 定义为:
(* a simple program in EBNF − Wikipedia *)
program = 'PROGRAM' , white space , identifier , white space ,
'BEGIN' , white space ,
{ assignment , ";" , white space } ,
'END.' ;
identifier = alphabetic character , [ { alphabetic character | digit } ] ;
number = [ "-" ] , digit , [ { digit } ] ;
string = '"' , { all characters − '"' } , '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A"|"B"|"C"|"D"|"E"|"F"|"G"
|"H"|"I"|"J"|"K"|"L"|"M"|"N"
|"O"|"P"|"Q"|"R"|"S"|"T"|"U"
|"V"|"W"|"X"|"Y"|"Z" ;
digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
white space = ? white space characters ? ;
all characters = ? all visible characters ? ;
一个语法上正确的程序:
PROGRAM DEMO1
BEGIN
A0:=3;
B:=45;
H:=-100023;
C:=A;
D123:=B34A;
BABOON:=GIRAFFE;
TEXT:="Hello world!";
END.
这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。
使用了在标准中提议为正规表示的下列字符:
用途 符号表示
定义 =
串接 ,
终止 ;
分隔 |
可选 [ ... ]
重复 { … }
分组 ( … )
双引号 ” … “
单引号 ‘ … ‘
注释 (* … *)
特殊序列 ? … ?
除外 -
约定
1. 使用了如下约定:
1. 扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;
2. 结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。
2. 表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:
* repetition-symbol
- except-symbol
, concatenate-symbol
| definition-separator-symbol
= defining-symbol
; terminator-symbol
3. 下列括号对超越正常优先级:
' first-quote-symbol first-quote-symbol '
" second-quote-symbol second-quote-symbol "
(* start-comment-symbol end-comment-symbol *)
( start-group-symbol end-group-symbol )
[ start-option-symbol end-option-symbol ]
{ start-repeat-symbol end-repeat-symbol }
? special-sequence-symbol special-sequence-symbol ?
作为例子,下列语法规则展示了表达重复的设施:
aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "D";
这些规则定义的终结字符串如下:
aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: D AAAD AAAAAAD etc.
有关工作
1. W3C 使用一种不同的 EBNF 来指定 XML 语法。
2. British Standards Institute 在1981年出版了一个 EBNF 标准: BS 6154。
3. IETF 使用在 RFC 4234 中规定的扩充 BNF (ABNF)。
ps,由于中文维基百科尚不可访问,所以就原文转载了其中关于巴科斯范式和扩展巴科斯范式的词条。
发表评论
-
IE浏览器stylesheets加载资源限制问题
2015-03-08 20:30 1072@import url()做一下总结: 1:@import ... -
理解Javascript原型及继承
2012-08-15 22:13 1346js初次使用起来觉得很简单但是在使用一段时间后很不深入的理解原 ... -
JS判断IE浏览器支持版本
2012-02-01 19:00 2968/* * @description 判断是否是IE,返回具体 ... -
jsonp动态创建script方式IE9问题
2012-02-01 16:28 2384在IE9浏览器创建一个script元素,然后指定其src属性u ... -
IE9下使用jsonp方式调用问题
2012-01-31 19:03 22921. 如果JSONP返回的Content-Type不符合规范, ... -
JavaScript获取浏览器语言类型
2011-12-31 18:24 7807获取浏览器语言: IE: navigator.browser ... -
IE Security Comprehensive Protection
2011-12-19 20:14 1766IE浏览器安全方面的处理,本人英文不好建议大家直接看英文: ... -
javaScript 中比较数字字符串问题
2011-10-10 21:49 4674在实现前端页面排序功能过程中遇到的问题,由于自己的粗心导致了生 ... -
javascript设置label标签 for属性
2011-09-11 10:36 3607js创建label标签的for属性用来增加操作响应区域。 v ... -
javascript事件绑定addEventListener,attachEvent
2011-07-31 18:55 3523为了考虑浏览器的兼容性问题,都需要对浏览器进行类型检测。 f ... -
readyState五种状态详解
2011-07-24 14:15 1614(0) UNINITIALIZED 未初始化 The obje ... -
getElementByTagName 与 querySelectorAll
2011-07-14 11:29 1478虽然网上有中文翻译但是还是直接看英文有感觉。getElemen ... -
拖放 Drag and drop 方法
2011-07-10 18:55 1526虽然网上又很多实现方法,但是还是需要理解拖放原理。通过绑定on ... -
闭包传入参数 window & undefined
2011-07-03 08:53 2303大家在前端开发中对闭包应该和熟悉了,也就是几种常见的闭包方式: ... -
textarea光标位置插入文字
2011-06-18 18:14 2129各浏览器TextArea获得焦点后的光标位置情况: text ... -
IE6上Array不支持indexOf方法
2011-06-06 10:17 2252在IE6不支持Array上indexOf方法,又是可恶的ie, ... -
处理不支持JavaScript脚本情况
2011-05-26 10:24 1339现在主流的浏览器都支持javascrip, 但还是有小部分不支 ... -
动态创建iframe设置属性name问题
2011-04-20 13:54 2732通常iframe的name可以是link或者form的targ ... -
WebSocket and Socket.IO
2011-04-06 15:39 3464WebSocket API是下一代客户端-服务器的异步通信方法 ... -
Preload CSS/JavaScript预加载
2011-04-06 10:20 1473希望达到效果是页面第一次载入以后,如果在次刷新页或者进入下一个 ...
相关推荐
BNF(巴科斯范式,Backus-Naur Form)是一种形式化语法的表示方法,广泛用于描述编程语言的语法结构。它由John Backus和Peter Naur在20世纪50年代末提出,旨在为ALGOL编程语言提供一个清晰的语法定义。在本资源中,...
在创建预测分析表之前,我们需要将这些规则转化为BNF(巴科斯范式)或EBNF(扩展巴科斯范式)的形式,这是一种形式化的表示语言的语法结构的方法。 接着,我们需要构建预测分析表。预测分析表由状态和输入符号组成...
信息技术 语法元语言 扩展的BNF标准(EBNF) 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用...
#### 语法规范的扩展巴科斯范式:ABNF **ABNF(Augmented BNF for Syntax Specifications: ABNF)** 是一种基于传统巴科斯范式的扩展版本,用于描述语法规范。与原始的巴科斯范式相比,ABNF具有更丰富的表达能力和...
巴科斯范式(Backus-Naur Form,简称BNF)是一种形式化的语法描述方法,广泛应用于计算机语言的定义,尤其是编译器设计领域。BNF查看器是一个专门用来解析和展示BNF范式的工具,它能够帮助用户理解和分析BNF规范,对...
BNF,巴科斯范式(Backus-Naur Form),是一种形式语法的表示方法,常用于描述编程语言或标记语言的语法结构。在SQL-92、SQL-99和SQL-2003中,BNF被用来精确地定义SQL的各种语句和表达式的结构,帮助开发者理解SQL的...
下面我们将详细探讨递归下降分析、扩展巴科斯范式(EBNF)以及它们在Verilog中的应用。 **递归下降分析(Recursive Descent Parsing)** 递归下降分析是一种自顶向下的解析策略,它基于编程语言的语法结构,通过一...
接着,Yacc(Yet Another Compiler-Compiler)是一个语法分析器生成器,它根据一套语法规则(通常以巴科斯范式或扩展巴科斯范式表示)来解析由Lex生成的tokens,构建抽象语法树(AST),并执行必要的计算。...
语法分析则基于一套定义明确的语法规则(通常用巴科斯范式或扩展巴科斯范式表示)来构建抽象语法树(AST),将记号序列转化为更高级别的结构。语义分析则检查程序的逻辑正确性,并进行类型检查,确保符合编程语言的...
2. **语法分析**:接着,语法分析器根据预先定义的语法规则(通常以巴科斯范式或扩展巴科斯范式表示)将词法单元转化为抽象语法树(AST)。在这个阶段,学生需要理解和应用上下文无关文法(CFG)来构建解析器。 3. ...
2. **语法分析**:基于一套预先定义的语法规则(通常使用巴科斯范式或扩展巴科斯范式表示),语法分析器将词法分析产生的记号流转换成抽象语法树(AST),这是一种直观表示程序结构的数据结构。 3. **语义分析**:...
它根据文法规则(通常以巴科斯范式或扩展巴科斯范式表示)检查记号序列是否符合语言的结构。Pl/0语言的语法相对简单,但仍需遵循一定的规则,例如,声明部分必须在程序开始,表达式必须按照特定的优先级和结合性进行...
这份文档可能包含了BNF(巴科斯范式)或者EBNF(扩展巴科斯范式)形式的语法规则,帮助我们明确`case`和`for`语句的结构和使用方式。 `fix.txt`、`case.txt`和`for.txt`是测试文件,分别用于测试编译器对原生PL0...
2. **语法分析**:语法分析器(通常是解析器)根据Tiger语言的语法规则(通常以巴科斯范式或扩展巴科斯范式表示)将词法单元组合成抽象语法树(AST)。这个过程可以通过递归下降解析或LR/LALR解析技术来实现,Java中...
首先,我们从"第二章 高级语言及其语法描述(1-2).ppt"开始,这部分内容通常会介绍编程语言的基本结构和特性,以及如何用形式化的语法描述语言(如巴科斯范式或扩展巴科斯范式EBNF)来定义语言的句法规则。...