從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可以使用組合()和交換|

但兩者的括號表達式[]同樣的
發佈了25 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章