https://bnfplayground.pauliankline.com/?bnf=%3Csimple_where_params%3E%20%3A%3A%3D%20(%20%3Csyntax_statement%3E%20%3Cseparator%3E%2B%20(%20%3Cand_option%3E%20%7C%20%3Cor_option%3E%20)%20%3Cseparator%3E%2B%20)*%20%3Csyntax_statement%3E%0A%0A%3Csyntax_statement%3E%20%3A%3A%3D%20%3Ccompare_statement%3E%20%7C%20%3Cin_statement%3E%0A%0A%3Ccompare_statement%3E%20%3A%3A%3D%20%3Cfield_name%3E%20%3Cseparator%3E%2B%20%3Ccompare_option%3E%20%3Cseparator%3E%2B%20(%20%3Cliteral%3E%20%7C%20%3Cdigit%3E%2B%20)%0A%0A%3Cin_statement%3E%20%3A%3A%3D%20%3Cfield_name%3E%20%3Cseparator%3E%2B%20%3Cin_option%3E%20%3Cseparator%3E*%20%3Cliteral_value%3E%0A%0A%3Cfield_name%3E%20%3A%3A%3D%20(%20%5Ba-z%5D%20%7C%20%5BA-Z%5D%20)%20(%20%5Ba-z%5D%20%7C%20%5BA-Z%5D%20%7C%20%22_%22%20%7C%20%5B0-9%5D%20)*%0A%0A%3Cin_option%3E%20%3A%3A%3D%20(%20%22I%22%20%7C%20%22i%22%20)%20(%20%22N%22%20%7C%20%22n%22%20)%0A%3Ccompare_option%3E%20%3A%3A%3D%20%22%3E%22%20%7C%20%22%3D%22%20%7C%20%22%3C%22%20%7C%20%22%3C%3E%22%20%7C%20%22%3C%3D%22%20%7C%20%22!%3D%22%20%7C%20%22%3E%3D%22%0A%0A%3Cand_option%3E%20%3A%3A%3D%20(%20%22A%22%20%7C%20%22a%22%20)%20(%20%22N%22%20%7C%20%22n%22%20)%20(%20%22D%22%20%7C%20%22d%22%20)%0A%3Cor_option%3E%20%3A%3A%3D%20(%20%22O%22%20%7C%20%22o%22%20)%20(%20%22R%22%20%7C%20%22r%22%20)%0A%0A%3Cliteral_value%3E%20%3A%3A%3D%20%22(%22%20%3Cseparator%3E*%20(%20%3Cliteral%3E%20%3Cseparator%3E*%20%22%2C%22%20%3Cseparator%3E*%20)*%20%3Cliteral%3E%20%3Cseparator%3E*%20%22)%22%0A%3Cseparator%3E%20%3A%3A%3D%20(%20%22%20%22%20%7C%20%22%5Cn%22%20)%0A%3Cliteral%3E%20%3A%3A%3D%20%22%27%22%20%3Ctext%3E%20%22%27%22%0A%3Ctext%3E%20%3A%3A%3D%20%3Ccharacter%3E%20%3Ctext%3E%20%7C%20%3Ccharacter%3E%0A%3Ccharacter%3E%20%3A%3A%3D%20%3Cletter%3E%20%7C%20%3Cdigit%3E%0A%3Cletter%3E%20%3A%3A%3D%20%22A%22%20%7C%20%22B%22%20%7C%20%22C%22%20%7C%20%22D%22%20%7C%20%22E%22%20%7C%20%22F%22%20%7C%20%22G%22%20%7C%20%22H%22%20%7C%20%22I%22%20%7C%20%22J%22%20%7C%20%22K%22%20%7C%20%22L%22%20%7C%20%22M%22%20%7C%20%22N%22%20%7C%20%22O%22%20%7C%20%22P%22%20%7C%20%22Q%22%20%7C%20%22R%22%20%7C%20%22S%22%20%7C%20%22T%22%20%7C%20%22U%22%20%7C%20%22V%22%20%7C%20%22W%22%20%7C%20%22X%22%20%7C%20%22Y%22%20%7C%20%22Z%22%20%7C%20%22a%22%20%7C%20%22b%22%20%7C%20%22c%22%20%7C%20%22d%22%20%7C%20%22e%22%20%7C%20%22f%22%20%7C%20%22g%22%20%7C%20%22h%22%20%7C%20%22i%22%20%7C%20%22j%22%20%7C%20%22k%22%20%7C%20%22l%22%20%7C%20%22m%22%20%7C%20%22n%22%20%7C%20%22o%22%20%7C%20%22p%22%20%7C%20%22q%22%20%7C%20%22r%22%20%7C%20%22s%22%20%7C%20%22t%22%20%7C%20%22u%22%20%7C%20%22v%22%20%7C%20%22w%22%20%7C%20%22x%22%20%7C%20%22y%22%20%7C%20%22z%22%0A%3Cdigit%3E%20%3A%3A%3D%20%220%22%20%7C%20%221%22%20%7C%20%222%22%20%7C%20%223%22%20%7C%20%224%22%20%7C%20%225%22%20%7C%20%226%22%20%7C%20%227%22%20%7C%20%228%22%20%7C%20%229%22&name=BNF%20(from%20Wikipedia)%20with%20Modification
<simple_where_params> ::= ( <syntax_statement> <separator>+ ( <and_option> | <or_option> ) <separator>+ )* <syntax_statement> <syntax_statement> ::= <compare_statement> | <in_statement> <compare_statement> ::= <field_name> <separator>+ <compare_option> <separator>+ ( <literal> | <digit>+ ) <in_statement> ::= <field_name> <separator>+ <in_option> <separator>* <literal_value> <field_name> ::= ( [a-z] | [A-Z] ) ( [a-z] | [A-Z] | "_" | [0-9] )* <in_option> ::= ( "I" | "i" ) ( "N" | "n" ) <compare_option> ::= ">" | "=" | "<" | "<>" | "<=" | "!=" | ">=" <and_option> ::= ( "A" | "a" ) ( "N" | "n" ) ( "D" | "d" ) <or_option> ::= ( "O" | "o" ) ( "R" | "r" ) <literal_value> ::= "(" <separator>* ( <literal> <separator>* "," <separator>* )* <literal> <separator>* ")" <separator> ::= ( " " | " " ) <literal> ::= "'" <text> "'" <text> ::= <character> <text> | <character> <character> ::= <letter> | <digit> <letter> ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" <digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
测试用例:
asdfasjdl in ('asdfasdf' , 'asdfasdf') and asdfasdf < 16 or asdf <= 'asdfasdf'
https://blog.csdn.net/lin_strong/article/details/78583543
扩展巴科斯范式(EBNF)简介
介绍
扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法。简而言之,它是一种描述语言的语言。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。
最初由尼克劳斯·维尔特开发,最常用的EBNF变体由标准是 ISO-14977 所定义。
EBNF的基本语法形式如下,这个形式也被叫做production:
左式(LeftHandSide) = 右式(RightHandSide).
左式也被叫做 非终端符号(non-terminal symbol),而右式则描述了其的组成。
终端符号与非终端符号
- 终端符号(Terminal symbols):形成所描述的语言的最基本符号。所描述语言的标点符号(不是EBNF自己的)会被左右加引号(它们也是终端符号),而其他终端符号会用粗体(这边因不方便加粗,就不加粗了)打印。
- 非终端符号:是用于描述语法的变量,它必须被定义在一个production中。或说,它们必须出现在某个地方的production的左式中。
符号
下表是 推荐标准ISO/IEC 14977 所定义的符号:
约定
1 .使用了如下约定:
- EBNF的每个元标识符(meta-identifier)都被写为用连字符(“-“,hyphens)连接起来的一个或多个单词;
- 以 “-symbol” 结束的元标识符是EBNF的终端符号。
2 .用普通字符表示的EBNF操作符按照优先级(顶部为最高优先级)排序为:
*repetition-symbol(重复符)
-except-symbol(除去符)
, concatenate-symbol(连接符)
| definition-separator-symbol
= defining-symbol(定义符)
; terminator-symbol(结束符)
. terminator-symbol(结束符)
3 .以下的括号对(bracket pairs)能够改变优先级,括号对间也有优先级(顶部为最高优先级):
' first-quote-symbol first-quote-symbol ' (* 引用 *)
" second-quote-symbol second-quote-symbol " (* 引用 *)
(* start-comment-symbol end-comment-symbol *) (* 注释 *)
( start-group-symbol end-group-symbol ) (* 分组 *)
[ start-option-symbol end-option-symbol ] (* 可选 *)
{ start-repeat-symbol end-repeat-symbol } (* 重复 *)
? special-sequence-symbol special-sequence-symbol ? (* 特殊序列 *)
下例示范了怎么表达重复:
aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "D";
这些规则定义的终端字符串如下:
aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: D AAAD AAAAAAD etc.
扩展
除了标准的定义,在FREESCALE文档中还使用了以下约定:
- 计数重复:任何由”{“和”}”括起来并后跟一个上标x的东西必须准确地重复出现x次。x也可能是一个非终端字符。比如下例中,Stars相当于四个星号:
Stars = {“*”}4. - 字节数:见到任何紧跟着由一对中括号“[”和“]”括起来的数字n的标识符,都应该认为它是一个高位字节在前的二进制数,并且字节数为n,如:
Struct=RefNo FilePos[4]. - 在一些例子中,我们会使用”<”和”>”括起来一些文本。这些文本是 元文本(meta–literal),它们的位置应该被它们所描述的东西替代掉,如,对于 < any char >,它的位置可以插入任意字符。
示例
以下提供一些示例以直观的理解EBNF。
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit = "0" | digit excluding zero ;
natural number = digit excluding zero, { digit } ;
integer = "0" | [ "-" ], natural number ;
digit excluding zero 可以是 1到9任意一个字符,digit则扩展为0到9任意一个字符。
natural number可以是1、2、…、10、…、12345、…,因为{}代表重复任意次,包括0次。
integer则可以是0或者可能带个负号的自然数。
这是用EBNF描述的EBNF自身语法:
Production = NonTerminal "=" Expression ".".
Expression = Term {"|" Term}.
Term = Factor {Factor}.
Factor = NonTerminal
| Terminal
| "(" Expression ")"
| "[" Expression "]"
| "{" Expression "}".
Terminal = Identifier | “"“ <any char> “"“.
NonTerminal = Identifier.
非终端符号可以是任意你喜欢的名字,而终端符号则要不然是出现在被描述的语言中的标识符,要不然就是任何被引号括起来的字符序列。
然后Factor(参数)可以是终端字符、非终端字符、三种括号中任意一种括起来的表达式。
Term(术语)由起码一个Factor组合而成……
用EBNF描述的一个只能赋值的类PASCAL编程语言:
(* a simple program syntax in EBNF − Wikipedia *)
program = 'PROGRAM', white space, identifier, white space,
'BEGIN', white space,
{ assignment, ";", white space },
'END.' ;
identifier = alphabetic character, { alphabetic character | digit } ;
number = [ "-" ], digit, { digit } ;
string = '"' , { all characters - '"' }, '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
white space = ? white space characters ? ;
all characters = ? all visible characters ? ;
对应的语法正确的程序如下:
PROGRAM DEMO1
BEGIN
A:=3;
B:=45;
H:=-100023;
C:=A;
D123:=B34A;
BABOON:=GIRAFFE;
TEXT:="Hello world!";
END.
参考文献
[1] Freescale semiconductor. HC(S)08/RS08 and S12(X) Build Tools Utilities Manual. 2010
[2] Extended Backus–Naur form. https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
理解巴科斯-诺尔范式 (BNF) 语法
https://blog.csdn.net/weixin_34259232/article/details/92757620
语法结构使用BNF范式形式给出,先做一个简单了解。
在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
尖括号( < > )内包含的为必选项。
方括号( [ ] )内包含的为可选项。
大括号( { } )内包含的为可重复0至无数次的项。
竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
::= 是“被定义为”的意思。
BNF 语法使用下表中显示的表示法。
约定/符号 | 含义 |
---|---|
::= |
等效 |
| |
OR |
X+ |
一个或多个 X 。 |
[X] |
X 可选。可选的分隔符由 [] 表示。 |
任何粗体文本 | 字符串。 |
任何斜体 文本 | 如何构造字符串。 |
正如前表中所指出的,注册器脚本使用字符串。这些值是必须出现在脚本中的实际的文本。下表描述 ATL 注册器脚本中使用的字符串。
字符串 | 操作 |
---|---|
ForceRemove | 完全移除下一项(如果存在),然后重新创建它。 |
NoRemove | 在“注销”期间不移除下一项。 |
val | 指定 <Key Name> 实际上是一个命名值。 |
Delete | 在“注册”期间删除下一项。 |
s | 指定下一个值为字符串 (REG_SZ)。 |
d | 指定下一个值为 DWORD (REG_DWORD)。 |
m | 指定下一个值为多字符串 (REG_MULTI_SZ)。 |
b | 指定下一个值为二进制值 (REG_BINARY)。 |
BNF 语法示例
以下是一些语法示例,可以帮助您理解表示法和字符串在 ATL 注册器脚本中的工作方式。
语法示例 1
<registry expression> ::= <Add Key>
指定 registry expression
等效于 Add Key
。
语法示例 2
<registry expression> ::= <Add Key> | <Delete Key>
指定 registry expression
等效于 Add Key
或 Delete Key
。
语法示例 3
<Key Name> ::= '<AlphaNumeric>+'
指定 Key Name
等效于一个或多个 AlphaNumeric
。
语法示例 4
<Add Key> ::= [ForceRemove | NoRemove | val]<Key Name>
指定 Add Key
等效于 Key Name
,而且字符串、ForceRemove
、NoRemove
以及 val
均为可选。
语法示例 5
<AlphaNumeric> ::= any character not NULL, that is, ASCII 0
指定 AlphaNumeric
等效于任何非空字符。
语法示例 6
val 'testmulti' = m 'String 1 String 2 '
指定项名 testmulti
是由 String 1
和 String 2
组成的多字符串值。
转载于:https://blog.51cto.com/tianya23/633141