Context-free grammar 与 BNF

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

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

名词解释

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

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

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

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

例如:

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

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

再例如:

S -> cAd
A -> a|ab

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

BNF

在语言学中,Context-free grammar 常被称为短语结构文法(phrase structure grammar );在计算机领域,Context-free grammar 被称为 Backus normal form (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+

你可能感兴趣的:(编程语言)