SQL语法格式在生成语法图时,通常会碰到诸如<标签>::=、{}、[]、()、... 、|等符号。那么这些符号都有什么用途呢?本篇文章将介绍每种符号在SQL语句中所扮演的角色,并给出具体示例以供参考。
<标签>::=
<标签> ::= 表示语法块的名称。此规则用于对可在语句中的多个位置使用的过长语法或语法单元部分进行分组和标记。适合使用语法块的每个位置由括在尖括号内的标签表示:<标签>。

本示例中,CreateDatabaseStmt、IfNotExists、DBName、DatabaseOptionListOpt都表示语法块。同时由于CreateDatabaseStmt语法图过长,分别将其中的IfNotExists、DBName和DatabaseOptionListOpt语法单元生成独立的语法图。
{}
大括号聚集规则中的元素。在大括号中的规则部分必须明确指定。大括号中如果有多个可选项,只能在其中选择一项。


本示例中,ALTER JAVA语法块对应的语法规则中有如下5对大括号:
{SOURCE | CLASS}:生成语法图时,两者只能选其一。
{schema_name | - }:出现两次,两者选其一。
{COMPILE | RESOLVE}:两者选其一。
{{COMPILE | RESOLVE} | invoke_rights_clause}:此代码中,出现两对嵌套的大括号;第一对{COMPILE | RESOLVE}两者选其一;第二对可以把{COMPILE | RESOLVE}看作一个整体,可以选{COMPILE | RESOLVE},也可以选择 invoke_rights_clause。
[]
中括号一般而言是用来区别关键字和表名or列名的地方。 []表示可选项。此处使用上图中的alter_java语法块举例。
在该示例中,RESOLVE所在的中括号在整个语法规则中属于一个可选项。按照语法规则可以选择走RESOLVE路径也可以直接跳过RESOLVE,直接走向下一步。
同时,在RESOLVE所在的中括号中嵌套了几对中括号,例如[,]。当语法走到match_string时,由于中括号代表可选项,所以此处有两条路,或者选择[,],或者直接跳过走向下一步。
()
小括号表示必须的意思。此处使用上图中的alter_java语法块举例。
在该示例中,RESOLVE所在的中括号中包含了三对小括号。当语法走到RESOLVE时,第一对是最外面的小括号,表示小括号中是必须选择的内容;第二对是紧挨着的小括号,也是必须选择的内容;第三对小括号因为位于[]... 内部,如果选择走[]... 路线,表示小括号里的内容也是语法必选的内容。
...
英文省略号表示在规则中省略号应用的元素可以被重复多次。如果省略号紧跟在大括号"}"之后,那么它应用于大括号之间的规则部分。如果省略号出现在其他任何元素的后面,那么它只应用于该元素。此处使用上图中的alter_java语法块举例。
在该示例中,由于省略号位于中括号“[]”之后,表示[]里的元素可以重复。也就是如下元素可以被重复。

|
|代表或者,表示只能选择其中一个。此处使用上图中的alter_java语法块举例。
在该示例中,{SOURCE | CLASS}两者只能选其一;{schema_name | - }两者只能选其一;{COMPILE | RESOLVE}两者只能选其一。




