从BRE 与 ERE的文法看两者的异同

Posted ouyangbuxiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从BRE 与 ERE的文法看两者的异同相关的知识,希望对你有一定的参考价值。


关于BRE 和ERE,下面是Open Group公布的文法定义:
BRE and Bracket Expression Grammar
%token ORD_CHAR QUOTED_CHAR DUP_COUNT

%token BACKREF L_ANCHOR R_ANCHOR

%token Back_open_paren Back_close_paren
/* '/(' '/)' */

%token Back_open_brace Back_close_brace
/* '/{' '/}' */

/* The following tokens are for the Bracket Expression
grammar common to both REs and EREs. */

%token COLL_ELEM META_CHAR

%token Open_equal Equal_close Open_dot Dot_close Open_colon Colon_close
/* '[=' '=]' '[.' '.]' '[:' ':]' */

%token class_name
/* class_name is a keyword to the LC_CTYPE locale category */
/* (representing a character class) in the current locale */
/* and is only recognised between [: and :] */

%start basic_reg_exp
%%

/* --------------------------------------------
Basic Regular Expression
--------------------------------------------
*/
basic_reg_exp : RE_expression
| L_ANCHOR
| R_ANCHOR
| L_ANCHOR R_ANCHOR
| L_ANCHOR RE_expression
| RE_expression R_ANCHOR
| L_ANCHOR RE_expression R_ANCHOR
;
RE_expression : simple_RE
| RE_expression simple_RE
;
simple_RE : nondupl_RE
| nondupl_RE RE_dupl_symbol
;
nondupl_RE : one_character_RE
| Back_open_paren RE_expression Back_close_paren
| Back_open_paren Back_close_paren
| BACKREF
;
one_character_RE : ORD_CHAR
| QUOTED_CHAR
| '.'
| bracket_expression
;
RE_dupl_symbol : '*'
| Back_open_brace DUP_COUNT Back_close_brace
| Back_open_brace DUP_COUNT ',' Back_close_brace
| Back_open_brace DUP_COUNT ',' DUP_COUNT Back_close_brace
;

/* --------------------------------------------
Bracket Expression
-------------------------------------------
*/
bracket_expression : '[' matching_list ']'
| '[' nonmatching_list ']'
;
matching_list : bracket_list
;
nonmatching_list : '^' bracket_list
;
bracket_list : follow_list
| follow_list '-'
;
follow_list : expression_term
| follow_list expression_term
;
expression_term : single_expression
| range_expression
;
single_expression : end_range
| character_class
| equivalence_class
;
range_expression : start_range end_range
| start_range '-'
;
start_range : end_range '-'
;
end_range : COLL_ELEM
| collating_symbol
;
collating_symbol : Open_dot COLL_ELEM Dot_close
| Open_dot META_CHAR Dot_close
;
equivalence_class : Open_equal COLL_ELEM Equal_close
;
character_class : Open_colon class_name Colon_close
;

/* --------------------------------------------
Extended Regular Expression
--------------------------------------------
*/
extended_reg_exp : ERE_branch
| extended_reg_exp '|' ERE_branch
;
ERE_branch : ERE_expression
| ERE_branch ERE_expression
;
ERE_expression : one_character_ERE
| '^'
| '$'
| '(' extended_reg_exp ')'
| ERE_expression ERE_dupl_symbol
;
one_character_ERE : ORD_CHAR
| QUOTED_CHAR
| '.'
| bracket_expression
;
ERE_dupl_symbol : '*'
| '+'
| '?'
| '{' DUP_COUNT '}'
| '{' DUP_COUNT ',' '}'
| '{' DUP_COUNT ',' DUP_COUNT '}'
;

可以看出BRE和ERE的几点区别:
1.特殊字符不同(也即意味着除去特殊字符剩下的普通字符也不完全相同)
BRE:
.[/ 句点, 左括号和反斜线除了用在括号表达式中, 应当是特殊的. 表达式包含
'[', 而'['前面不带反斜线且不是括号表达式一部分时, 产生未定义的结果.

* 星号应当是特殊的, 除非当用于:
A) 括号表达式
B) 整个BRE的第一个字符(如果有开头的'^', 在其后)
C) 作为子表达式的第一个字符(如果有开头的'^', 在其后)

^ 抑扬符号当如下使用时应当是特殊的:
A)定位符(anchor)
B)括号表达式的第一个字符

$ 美元符号, 当用作定位符时是特殊的.

ERE:
.[/( 句点, 左括号, 反斜线, 和左圆括号当不用于括号表达式中时应当是特殊的.
在括号表达式外, 紧跟右圆括号的左圆括号产生未定义的结果.

) 无论在括号表达式内外, 当与前面的左圆括号匹配时, 右圆括号应当是特殊的.

*+?{ 星号, 加号, 问号, 和左大括号当不用于括号表达式中时应当是特殊的.

下面的任何用法产生未定义结果:
A) 如果这些字符出现在ERE的第一个, 或者紧跟竖线, 抑扬符, 或左
圆括号
B) 如果左大括号不是有效的间隔表达式的一部分

| 竖线符号应当是特殊的, 除非用于括号表达式中. 竖线符号出现在ERE的第一
个或最后, 或者紧跟竖线或左圆括号, 或在右圆括号前面, 将产生未定义的
结果.

^ 当用于下面情况时, 抑扬符应当是特殊的:
A) 定位符
B) 括号表达式的第一个字符

$ 当用作定位符时, 美元符应当是特殊的.
2.BRE可以使用向后引用
3.字符重复匹配次数语法不同(BRE:/{m,n/} ;ERE:{m,n} )
4.ERE可以使用组合()和交换|

但两者的括号表达式[]同样的

以上是关于从BRE 与 ERE的文法看两者的异同的主要内容,如果未能解决你的问题,请参考以下文章

栈与队列,各有异同。

抽象类和接口的异同?

push推送机制与IM即时通信的长链接机制两者的异同

C中有关引用和指针的异同

null和undefined的异同

机器学习 vs 深度学习:了解两者的异同