`

BNF范式

 
阅读更多
BNF范式

  (BNF: Backus-Naur Form 的缩写;也称为巴科斯-瑙尔范式、巴克斯-诺尔范式),是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。
  是科学哲学家库恩提出的科学前进的模式,大意是一起工作的科学家们大体有一个共同的守则和目标,比如牛顿的经典力学,为此完成范式内的各项工作,科学的进步也就是一个范式取代另一个范式,比如后来的爱因斯坦的相对论在某种意义上的取代了宏观上的经典力学,还有量子力学在微观上完成了这个取代。
BNF范式的内容:
  在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
  在双引号外的字(有可能有下划线)代表着语法部分。
  < > : 内包含的为必选项。
  [ ] : 内包含的为可选项。
  { } : 内包含的为可重复0至无数次的项。
  | : 表示在其左右两边任选一项,相当于"OR"的意思。
  ::= : 是“被定义为”的意思
巴科斯范式的内容
  在双引号中的字("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
  [ "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 ]
  "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 ::= identifier "::=" expression
  expression ::= term { "|" term }
  term ::= factor
  factor ::= identifier |
  quoted_symbol |
  "(" expression ")" |
  "[" expression "]" |
  "{" expression "}"
  identifier ::= letter { letter | digit }
  quoted_symbol ::= """ """
  扩展的巴科斯范式 Augmented BNF
  RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进,比如说,在ABNF中,尖括号不再需要。
什么是EBNF?

  基本 (EBNF) 定义有关 EBNF 协定的详细情况,可以参看 Computing Dictionary.
  这里是要点一览: "..." : 术语符号 [...] : 选项:最多出现一次 {...} : 重复项: 任意次数,包括 0 次 (...) : 分组 | : 并列选项,只能选一个斜体字: 参数,在其它地方有解释
  http://estone.nease.net/sgf/sgf4.html#2 里会给出一个EBNF在棋牌类的应用.
  --------------------------------------------------------------------------------------------
  <BNF>::= <非终结符>::=<或项列表>
  <或项列表>::= <项> | <或项列表>|<项>
  <项>::= <非终结符> | <终结符> | <项><非终结符> | <项><终结符>
  <非终结符>::= <非终结符名>
  ( 但愿能有人看得懂:-) )
  BNF就是巴科特·瑙尔式的缩写,
  在计算机的史前时代(1950s),曾有一位大师,他奠定了现代计算机的基础
  在他老人家的诸多成就之中,包括了对形式语言的研究,和发明了高级语言:
  FORTRAN。
  为了纪念他老人家,我们把他提出的一套描述语言的方法叫做BNF
  其实BNF很简单::=表示定义 |表示或 尖括号(<>)括起来的是非终结符
  所谓非终结符就是语言中某些抽象的概念,终结符就是可以直接出现在
  语言中的符号
  比如:C语言的声明语句可以用BNF这样描述:
  <声明语句> ::= <类型><标识符>; | <类型><标识符>[<数字>];
  这一句中<声明语句>这个非终结符被定义成了两种形式(上面用|隔开的两部分)
  在这里引入了三个终结符: 分号; 左右方括号[ ]
  <类型> ::= <简单类型> | <指针类型> | <自定义类型>
  <指针类型> ::= <简单类型> * | <自定义类型> *
  <简单类型> ::= int|char|double|float|long|short|void
  <自定义类型> ::= enum<标识符>|struct<标识符>|union<标识符>|<标识符>
  到这里就基本上把<类型>定义清楚了
  <数字> ::= 0X<十六进制数字串> | 0<八进制数字串> | <十进制数字串>
  <十六进制数字串> ::= <十六进制数字> | <十六进制数字串><十六进制数字>
  <八进制数字串> ::= <八进制数字> | <八进制数字串><八进制数字>
  <十进制数字串> ::= <十进制数字> | <十进制数字串><十进制数字>
  <十六进制数字> ::= <十进制数字> | A | B | C | D | E | F
  <十进制数字> ::= <八进制数字> | 8 | 9
  <八进制数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
  到这里就把<数字>定义清楚了
  <标识符> ::= <字母> | <标识符> <字母数字串>
  <字母数字串> ::= <字母>|<十进制数字>|<字母数字串><字母>|<字母数字串><十进制数字>
  <字母> ::= _ | <大写字母> | <小写字母>
  <小写字母> ::= a|b|c|d|e|f|g|h|i|j …… (偷个懒)
  <大写字母> ::= A|B|C|D|E|F|G|H|I|J ……
  到此为止整个声明语句就定义完了(就是说已经没有非终结符了),虽然看起来很
  繁,但前面定义的各种非终结符都可以很容易的在别的地方重用比如,函数声明
  可以定义成下面的样子:
  <函数声明语句> ::= <类型><标识符>(<形参表>);
  <形参表> ::= <类型><标识符> | <形参表>,<形参表>
  只用两句就描述完了,所以BNF实际上比用自然语言要简练得多
  (整个C语言只用一二百句就可以描述清楚)
  而且相当的精确,不会有自然语言中那种模棱两可的表达
  如果你对BNF比较敏感的话,会发现C里面的标识符不能由数字开头
  而且在C里面下划线是被当做字母看待的(也就是说能用字母的地方
  都可以用下划线)比如:(最好用老一点的编译器比如PDP11上的cc)
  #define ____ main
  #define ___ for
  typedef char* _____;
  int (*______)(char *, ...) = printf; //如果这一句不灵,就用下面这句
  //#define ______ printf //如果你用的是C++可以试一下下面这个
  //int (*______)(const char *, ...) = printf;
  ____(_,char* __[]) //要是你编译器不吃,可以改成int ____(int _,char*__[])
  {
  ___( ; _ ; _ --)
  {
  ______("%s\n", __[_]);
  }
  }
另一种EBNF

  另外,还有一种EBNF就没有正宗的BNF这么爽了,也有很多人在用,前面的
  那些递归的定义被写成了{}
  有一段时间PASCAL爱好者们喜欢用一个叫语法图的东西,画出来很难看,但
  功能和BNF差不多,现在好象已经没多少人用了
  近几年流行另一种东西:
  digit = one of
  0 1 2 3 4 5 6 7 8 9
  这里非终结符digit用斜体表示,one of是这种方法里定义的一个量词(常用斜黑体)
分享到:
评论

相关推荐

    C、Java和Python的BNF范式

    「编程语言」课程的配套资源,包含了C、Java和Python的BNF范式生成规则。

    BNF范式查看器

    巴科斯范式(BNF)查看器,可查看BNF范式生成的First集,Follow集,Select集和预测分析表,是学习编译原理的好工具。 附带标准c的bnf范式文件。

    sql-99-bnf.tar.gz_Sql bnf_bnf范式 sql

    sql 99的 bnf范式,学习sql 99标准的最权威参考。

    RFC2234(SIP遵循的BNF范式)

    RFC2234(SIP遵循的BNF范式) 语法规范的扩展巴科斯范式:ABNF (RFC2234——Augmented BNF for Syntax Specifications: ABNF) 本备忘录的状态 本文档讲述了一种Internet社区的Internet标准跟踪协议,它需要...

    sql-92_bnf巴格达范式

    sql-92_bnf巴格达范式 for antler

    BNF详细的语法定义(包含所有的BNF关键字)

    BNF详细的语法定义 BNF详细的语法定义 BNF详细的语法定义

    CMM.rar_BNF 文法_bnf分析_bnf语法分析_cminus_cminus 语法

    这个语法分析器用到的是自顶向下的递归调用的方法,根据Cminus语言的文法规则 的BNF范式编写递归调用的代码,parse方法是程序的入口,它调用的stmt_sequence完成整个语法分析工作,stmt_sequence背后是12个互相调用...

    sql-92-bnf.tar.gz_BNF SQL92_bnf_sql b_sql server bnf_sql92 bnf

    sql 92的 bnf范式,学习sql 92标准的最权威参考

    sql-2003-bnf.tar.gz_bnf_sql 2003_sql2003

    sql 2003的 bnf范式,学习sql 2003标准的最权威参考

    论文研究-基于数据流模型的模糊聚类.pdf

    提出了一种角色访问控制扩展模型,该模型在标准RBAC体系中引入分级策略...在给出模型的形式化定义后,对模型的实现规则、访问策略、权限分配管理、在多级关系数据库中的实现机制及模型的BNF范式以及具体应用做了说明。

    论文研究-面向汽车动力学自动建模的模型描述语言研究.pdf

    定义了一种模型描述语言——MDL,采用BNF范式描述了MDL的语法规范,分析了其实现的内在机制。在汽车动力学建模中,将汽车模型采用自顶向下的划分方式,划分为多个相对独立的子系统,采用模型描述语言对各个子系统的...

    javacc源代码

    相一致 JavaCC还提供JJTree工具来帮助我们建立语法树 JJDoc工具为我们的源文件生成BNF范式 巴科斯 诺尔范式 文档 Html "&gt;JavaCC JavaCompilerCompiler 是一个用JAVA开发的最受欢迎的语法分析生成器 这个分析生成器...

    SIP协议详解(中文)

    1、SIP协议介绍 1 2、SIP协议功能概况 2 3、术语 2 ...25 SIP协议的BNF范式 137 26 安全考虑:威胁模式和安全应用建议。 151 27 IANA 认证 164 28 同RFC 2543的改变 166 29 标准索引 169 30 信息索引: 170

    论文研究-无标度网络抗攻击能力研究.pdf

    策略编写和表示是策略研究的基础。当前策略编写多直接面向设备和...然后通过提炼策略基本属性,设计了基于网络安全系统模型的多层安全策略表示方法,并采用BNF范式描述了策略语法规范,策略表示更加友好,操作性更强。

    计算的美丽-图灵奖获得者

    学家 James Gray和 1977年图灵奖获得者、Fortan程序语言和BNF范式的发明人 John Backus。他们的失踪和离世是全人类的损失。笔者坚信,他们的名字必将与 他们在其所在研究领域的发明创造一样,流芳百世。

    javacc 词法解析

    javacc是词法解析工具,遵循BNF范式。

    基于本体的冲压工艺知识表示方法研究 (2006年)

    针对冲压工艺的特点,提出了基于概念、关系、属性、规则和实例五要素的冲压工艺领域本体的形式化定义,采用BNF范式对领域本体进行统一的描述和表达,实现了BNF范式与关系数据库之间的转换。通过构建冲压工艺领域本体...

    javacc使用指南

    javaCC的功能和yacc相似,主要根据bnf范式生成解析程序,不过javaCC是集合了词法分析和语法分析生成java解析代码。。。

    用Lex编写的简易版C语言词法分析器(编译原理大作业1)

    主要针对的是编译原理程序设计这门课的大作业所做的小项目,里边有完整的代码,以及使用说明,包括bnf范式。

    sip RFC3261 中文版

    25 SIP协议的BNF范式 251 25.1 基本规则 252 26 安全考虑:威胁模式和安全应用建议。 273 26.1 攻击和威胁模式 274 26.1.1 注册服务 Hijacking。 274 26.1.2 模仿一个服务器 275 26.1.3 修改消息包体 276 26.1.4 ...

Global site tag (gtag.js) - Google Analytics