在進行XML文法分析之前,首先有必要了解XML語法的基本規則:
詞法特徵:1)XML區分大小寫,如元素名稱在開啟和關閉標記中應保持大小寫一致
2)XML保留標記字元為:< > &,保留字符號不允許出現在元素名稱、元素文字、屬性名稱、屬性值中,< 使用者開啟標記,>用於關閉標記,&用於轉意,常見的轉意為<產生<, >生成>,&生成&,&apos生成',"生成”
3)元素名以下劃線或字母開始,可包含字母、數字、句點、連字符、下劃線、冒號和用於其他語言的擴展字符,元素名中不能有空格符(分格符、跳格符、換行符、回車符),元素名可以由名域前綴。如:
4)屬性名的規則同元素名,屬性值由單引號或雙引號括約其中,可由除XML保留字元以外的字串組成,如:
句法特徵:1) XML文件由一個XML說明、多個可選的文件說明、多個可選的XML指令、多個可選的XML註解和一個根元素的資料體組成,此外還可以有嵌入語句中的CDATA段,如:
<?xml …?> /*XML说明*/ <!DOCTYPE …> /*XML文档说明*/ <!-- … --> /*XML注释*/ <?xml-stylesheet …?> /*XML指令*/ <root> /*根数据元素*/ <child> …<![CDATA[…]]> </child> </root>
2)XML說明由標關閉,其中包含版本、編碼等可選說明,如:
3)XML文件說明由關閉,如: 4)XML指令由關閉,如:
5)XML註釋由關閉,如:
6)XML元素由<元素名稱>打開,由/>,或元素名稱>關閉,元素的打開和關閉標記相互匹配,如
7)CDTATA段由打開,由]]>關閉,用於使居於其中的語句規避XML解析規則。如:
根據以上的XML文法特徵,可以構造出用於詞法分析的正則式和用於句法分析的下推自動機結構。
XML詞法正規式:
#define digit [1,2,…,9] /*數字字元*/
#define letter [a,b,…,z,A,B,…, Z] /*字母字元*/
#define signs [~, ! , @, #, %, ^, &,*,(, ), ?, :, ;, “, ', ,, ., / ,-, _, +, =, |, /] /*符號字元*/
#define ascii2 [0x80,…,0xFF] /*ASCII chart2 擴充字元*/
#define space [0x20, / t, /r, /n] /*空格符,跳格符,回車符,換行符*/
#define reserve [< , >, &] /*XML保留字元*/
1) 元素名稱的正規式:
element_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
2) 元素文字的正規式:
element_text -> (ε| not reserve)*
3)屬性名稱的正規式:
proper_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
4) 屬性文本的正則式:
proper_value -> (ε| not reserve)*
XML句法結構:
xml_document -> xml_header (ε| xml_declare | xml_instruct | xml_comments)* xml_element xml_header -> [<?xml](space)*(proper_token)*(space)* [?>] xml_declare -> [<!]reserve_word(space)*(token)*(space)*[>] xml_instruct -> [<?]reserve_word(space)* (proper_token)* (space)*[?>] xml_comments -> [<!--](ε| digit | letter | signs | ascii2 | space)*[-- >] xml_element -> [<]element_name (space)*( ε| proper_token)*(space)*[/>] | [<]element_name(space)*( ε | proper_token)*(space)*[>] [ε| <![CDATA[ ]element_text[ε| ]]>] (ε | xml_element)*(space)*[</]element_name[>] proper_token -> proper_name(space)*[=](space)* [ε| <![CDATA[ ] [‘ | “]proper_value[‘ | “] [ε| ]]>] reserve_word -> [DOCTYPE | ELEMENT | NOTATION | …] token -> (ε| not reserve)*
分析XML語法需要建構一個下推自動機,它的結構定義如下:
1)STACK_DFA mata_xml_doc =
Q: {…} /*详见后面的状态集合*/ Σ: /*指向待解析的XML元素词串*/ σ: Q×Σ->Q /*状态转移函数,见状态转移列表*/ q: {NIL_SKIP} /*初始状态*/ Γ: {NIL_FAILED,NIL_SUCCEED} /*终结状态集合*/ S: {Q/*状态*/, N/*DOM节点*/>,<…>} /*下推栈*/
2)堆疊頂符集合用於反映目前分析節點的類型:
T:{NIL/*空*/, TG/*标记*/, NS/*元素*/, IS/*指令*/, DS/*声明*/, CD/*CDATA界段*/,CM/*注释*/}
3)狀態集合反映了分析的某一階段特徵,與棧頂符對應:
NIL: NIL_FAILED /*失败*/ NIL_SKIP /*忽略*/ NIL_SUCCEED /*成功*/ CM: CM_BEGIN /*注释开始*/ CM_END /*注释结束*/ TG: TG_OPEN /*标记打开*/ TG_INT_CLOSE /*标记中断*/ TG_PRE_CLOSE /*标记准备关闭*/ TG_CLOSE /*标记关闭*/ NS: NS_NAME_BEGIN /*元素名开始*/ NS_NAME_END /*元素名结束*/ NS_KEY_BEGIN /*属性名开始*/ NS_KEY_END /*属性名结束*/ NS_ASIGN /*属性赋值*/ NS_VAL_BEGIN /*属性值开始*/ NS_VAL_END /*属性值结束*/ NS_TEXT_BEGIN /*元素文本开始*/ NS_TEXT_END /*元素文本结束*/ IS: IS_OPEN /*指令打开*/ IS_NAME_BEGIN /*指令名开始*/ IS_NAME_END /*指令名结束*/ IS_KEY_BEGIN /*指令键开始*/ IS_KEY_END /*指令键结束*/ IS_ASIGN /*赋值符*/ IS_VAL_BEGIN /*指令值开始*/ IS_VAL_END /*指令值结束*/ IS_CLOSE /*指令关闭*/ DS: DS_OPEN /*声明打开*/ DS_SKIP /*越过申明节*/ DS_CLOSE /*声明关闭*/ CD: CD_BEGIN /*CDATA界段开始*/ CD_END /*CDATA界段结束*/
以上是網頁程式設計-XML文法分析詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!