Context-free grammar 与 BNF,ASN.1

本文深入探讨了上下文无关文法(Context-free grammar)的概念,解析其在形式语言中的角色,以及如何通过终结符与非终结符构成的产生规则描述语言结构。同时,介绍了Backus normal form(BNF)在定义编程语言语法中的应用,以及Abstract Syntax Notation One(ASN.1)在数据描述中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

道生一,一生二,二生三,三生万物

https://en.wikipedia.org/wiki/Context-free_grammar

1. 名词解释

Context-free grammar:就是上下文无关文法,是一种形式文法(formal grammar)。形式文法是形式语言(formal language)的文法,由一组产生规则(production rules)组成,描述该形式语言中所有可能的字符串形式。形式文法一般可分为四大类:无限制文法(unrestricted grammars),上下文相关文法,上下文无关文法和正则文法(Regular grammar)。

Terminal symbols: 终结符,可以理解为基础符号,词法符号,是不可替代的,天然存在,不能通过文法规则生成!

Nonterminal symbols: 非终结符,或者句法变量。

Production rules: grammar 是由终结符集和、非终结符集和和产生规则共同组成。产生规则定义了符号之间如何转换替代。规则的左侧是规则头,是可以被替代的符号;右侧是规则体,是具体的内容。

例如:

<digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<integer> ::= ['-'] <digit> {<digit>}

符号(-,0,1,2,3,4,5,6,7,8,9)是终结符,符号(<digit>,<integer>)是非终结符。那么根据 integer 的生成规则,字符串 “0056, 0000, -000, -111” 都符合文法,可被解析。

再例如:

S -> cAd
A -> a|ab

该例中,(a, b, c, d) 为终结符,(S, A) 为非终结符,字符串"cad",“cabd” 符合文法规则。

2. BNF

在语言学中,Context-free grammar 常被称为短语结构文法(phrase structure grammar );在计算机领域,Context-free grammar 被称为 Backus normal form (BNF)。

BNF 主要用于对编程语言、文档格式、指令集、或者通信协议等的语法定义。它的应用非常广泛,大到使用BNF定义编程语言和语法规则(编程语言,SQL语法)、指令集,小到使用BNF编写伪代码,以便于他人也能够读懂其中的含义。

BNF的核心是推导规则(产生式)、约定符号和关键字(文本约定),使用这些约定的符号和产生式就可以完成某种语义的描述。

在这里插入图片描述

Cassandra 使用改进型的BNF来定义CQL语法:

例如:

关键字

identifier          ::=  unquoted_identifier | quoted_identifier
unquoted_identifier ::=  re('[a-zA-Z][a-zA-Z0-9_]*')
quoted_identifier   ::=  '"' (any character where " can appear if doubled)+ '"'

常量

constant ::=  string | integer | float | boolean | uuid | blob | NULL
string   ::=  '\'' (any character where ' can appear if doubled)+ '\''
              '$$' (any character other than '$$') '$$'
integer  ::=  re('-?[0-9]+')
float    ::=  re('-?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9+])?') | NAN | INFINITY
boolean  ::=  TRUE | FALSE
uuid     ::=  hex{8}-hex{4}-hex{4}-hex{4}-hex{12}
hex      ::=  re("[0-9a-fA-F]")
blob     ::=  '0' ('x' | 'X') hex+

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 } """

该段的含义是:

  • syntax 由一个或多个 rule 组成;
  • rule 由 identifier 加上符号 := 和 expression 表示;
  • expression 由一个或多个由 | 分割的 term 组成;
  • term 由一个或多个 factor 组成;
  • factor 由 identifier 或 quoted_symbol 或 3 种括号括起来的 expression 表示;
  • identifier 由字符或者数字组成;
  • quoted_symbol 由双引号括起来的任何字符组成;

3. ASN.1

BNF 标记了 ASN.1, 使它称为一种抽象的数据描述语言,类似于编程语言,ASN.1 也有相应的语法。ASN.1 种的基本元素包括:标识符,关键字,基本词汇/词。由这些基本的元素和类型,可推导出更复杂的、抽象的数据类型和结构。

ASN.1: Specification of basic notation

ASN.1 中常见的符号及含义:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值