道生一,一生二,二生三,三生万物
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” 符合文法规则。
在语言学中,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+