|
|
从BRE 与 ERE的文法看两者的异同 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
|
关于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可以使用组合()和交换|
但两者的括号表达式[]同样的 | 
|
|
相关文章:相关软件: |
|