| |
關於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的文法看兩者的異同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.