BNF范式

转载 2007年09月26日 11:41:00
括号的意思:将 ( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 /1 到/9 的符号来引用。

|的意思:将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。

*的意思:匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。

所以你给的那个例子00(0|1)*可以用来匹配00或者001或者000或者0000或者0011,但是不能匹配011等等。

具体定义还是要多参考一下下面的文章:

http://net.pku.edu.cn/~yhf/tao_regexps_zh.html

正则表达式,Regular Expression(也称为“regex”或“regexp”),是一种用来描述文本模式的特殊语法。一个正则表达式由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符,如/、*、?等)组成。简单地说,一个正则表达式就是你需要匹配的字符串。例如,正则表达式“A*B”匹配字符串“ACCCB”但是不匹配“ACCCC”。

什么是巴科斯范式?

巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。
现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。

巴科斯范式的内容

在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
尖括号( < > )内包含的为必选项。
方括号( [ ] )内包含的为可选项。
大括号( { } )内包含的为可重复0至无数次的项。
竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
::= 是“被定义为”的意思。

巴科斯范式示例

这是用BNF来定义的Java语言中的For语句的实例:

FOR_STATEMENT ::=
"for" "(" ( variable_declaration |
( expression ";" ) | ";" )
[ expression ] ";"
[ expression ] ";"
")" statement

这是Oracle packages的BNF定义:

package_body ::= "package" package_name "is"
package_obj_body { package_obj_body }
[ "begin" seq_of_statements ]
"end" [ package_name ] ";"

package_obj_body ::= variable_declaration
| subtype_declaration
| cursor_declaration
| cursor_body
| exception_declaration
| record_declaration
| plsql_table_declaration
| procedure_body
| function_body

procedure_body ::= "procedure" procedure_name
[ "(" argument { "," argument } ")" ]
"return" return_type
"is"
[ "declare" declare_spec ";" { declare_spec ";" } ]
"begin"
seq_of_statements
[ "exception" exception_handler { exception_handler } ]
"end" [ procedure_name ] ";"

statement ::= comment
| assignment_statement
| exit_statement
| goto_statement
| if_statement
| loop_statement
| null_statement
| raise_statement
| return_statement
| sql_statement
| plsql_block


这是用BNF来定义的BNF本身的例子:

syntax ::= { rule }
rule ::= identifier "::=" expression
expression ::= term { "|" term }
term ::= factor { factor }
factor ::= identifier |
quoted_symbol |
"(" expression ")" |
"[" expression "]" |
"{" expression "}"
identifier ::= letter { letter | digit }
quoted_symbol ::= """ { any_character } """



扩展的巴科斯范式 Augmented BNF

RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进,比如说,在ABNF中,尖括号不再需要。
参考资料:http://net.pku.edu.cn/~yhf/tao_regexps_zh.html 

编译技术,从BNF范式到文法识别简介

今日漫谈的是编译技术,作为计算机科学中的皇后,一只是编程中最为关键的技术之一,但由于太过繁杂,往往不被一般开发者重视。但其实,它是计算机代码优美结构的基石,了解编译技术,往往能让你成为更加优秀的程序员...
  • sun_xiaofan
  • sun_xiaofan
  • 2015年04月03日 13:43
  • 7178

C语言BNF范式

C89,bnf范式
  • preyta
  • preyta
  • 2015年02月09日 20:51
  • 2103

BNF范式学习

BNF 规定是推导规则(产生式)的集合,写为: ::= 这里的 符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠'|' 分隔的多个符号序列构成,每个符号序列整体都是左端的...
  • u014287775
  • u014287775
  • 2017年02月20日 16:00
  • 263

BNF范式 如何用C++实现自动推导

BNF范式ATTACK::= ATTACK_NAME { SIGNATURES  MATCH                                DESCRIPTION }ATTACK_NA...
  • lujia2716
  • lujia2716
  • 2005年04月15日 07:47
  • 949

巴科斯-诺尔(BNF范式)范式

BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程语言,参见[Naur60]...
  • begtostudy
  • begtostudy
  • 2010年11月22日 13:47
  • 4518

巴克斯范式

BNF是为了描述ALGOL 60语言而出现的。     http://www.blog.edu.cn/user1/18646/archives/2005/139037.shtml 巴科斯范式及...
  • stormbjm
  • stormbjm
  • 2013年10月08日 23:48
  • 2025

c语言的bnf总结

注:不能说是自己的原创,只能说自己是总结了下而已 translation_unit : external_decl | translation_unit external_decl ;exte...
  • sileiam
  • sileiam
  • 2013年11月16日 22:48
  • 728

基于BNF范式的M3中Schema板架语言的解析

基于BNF范式的M3中Schema板架语言的解析 by eattonton 摘要:M3系统中提供了一套完整的板架参数化建模系统,基于这套系统为设计员提供了建立船体结构的基础。随着M3在我国造船工业中的...
  • drinktonton
  • drinktonton
  • 2016年03月26日 21:56
  • 689

什么是BNF EBNF 巴科斯范式及其扩展 BNF & Augmented BNF

什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF                 什么是巴科斯范式?        巴科斯范式(BNF: Back...
  • sinolover
  • sinolover
  • 2017年11月24日 16:39
  • 86

巴克斯-诺尔范式语法说明

今天在看《》一书时返现一个
  • Joyhen
  • Joyhen
  • 2014年11月09日 16:39
  • 2435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BNF范式
举报原因:
原因补充:

(最多只允许输入30个字)