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范式查看器

  • 2016年11月20日 01:07
  • 82KB
  • 下载

sql-92_bnf巴格达范式

  • 2008年11月24日 11:15
  • 75KB
  • 下载

巴科斯范式(BNF: Backus-Naur Form)

什么是巴科斯范式?   巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描...

BNF范式简介

 BNF 规定是推导规则(产生式)的集合,写为: ::= 这里的 符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠 '|' 分隔的多个符号序列构成,每个符号序列整体...

C语言的BNF范式表示

bison 的规则中,对文法的描述,使用的是BNF范式,这是一种上下文无关文法。 用BNF来描述C语言,比自然语言简练多了,当然,逻辑上会有点复杂,不过平时可以研究研究。 以下代码来自 http:...

BNF范式和EBNF范式

1、什么是BNF范式,什么又是EBNF范式?(在学习中经常会碰到用BNF范式描述的规则,老是忘记每个符号确切的作用,现在把他们一一罗列如下,亲手记录的东西应该能记住吧。。。-__-|||) ...

What's BNF Notation

原文:http://cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html What is BNF notation? BN...

语法规范:BNF与ABNF

早上做智能施法项目,说一句话比如“明天6点开灯”,智能插座就会在6点把灯开起来,这涉及到语音语法方面的问题。由于科大讯飞开发语义,就决定用讯飞的SDK BNF        巴科斯范式(BNF...

c语言的bnf总结

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

sql各年标准bnf语法之xml展示

  • 2015年12月14日 10:38
  • 13.91MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BNF范式
举报原因:
原因补充:

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