在进行XML文法分析之前,首先有必要了解XML语法的基本规则:
词法特征:1)XML区分大小写,如元素名在打开和关闭标记中应保持大小写一致1b01232ea6f0577bc4ec8d1a522b6a86…6879c8de8c5e2889d23c06f516d46b6b,XML的保留词串应符合大小写要求40eed24cbc9faf0c347d89425ab61f30 8f52c3d5f1e09e976c814aa1b0a986bd…。
2)XML保留标记字符为:6d267e5fab17ea8bc578f9e7e5e1570b &,保留字符不允许出现在元素名、元素文本、属性名、属性值中,74563861e6065700fea00efef1b495e3用于关闭标记,&用于转意,常见的转意为 <生成28f6d38cf1092d2b140115d4813801ff,&生成&,&apos生成’,"生成”
3)元素名以下划线或字母开始,可包含字母、数字、句点、连字符、下划线、冒号和用于其他语言的扩展字符,元素名中不能有空格符(分格符、跳格符、换行符、回车符),元素名可以由名域前缀。如:1b01232ea6f0577bc4ec8d1a522b6a86 a376291d94db2e2f2a1f979ad148cf2a 元素文本可以是除XML保留字符外的字符集合,如1b01232ea6f0577bc4ec8d1a522b6a86 my money is $2000 6879c8de8c5e2889d23c06f516d46b6b
4)属性名的规则同元素名,属性值由单引号或双引号括约其中,可由除XML保留字符以外的字符串组成,如:b90ebca9dbe7a56cd77974d78d91ecc2。属性名有xmlns前缀,表明该属性定义了一个名域,如:19219245428dfee12fc709cb849a2e8f
句法特征:1)XML文档由一个XML说明、多个可选的文档说明、多个可选的XML指令、多个可选的XML注释和一个根元素的数据体组成,此外还可以有嵌入语句中的CDATA段,如:
<?xml …?> /*XML说明*/ <!DOCTYPE …> /*XML文档说明*/ <!-- … --> /*XML注释*/ <?xml-stylesheet …?> /*XML指令*/ <root> /*根数据元素*/ <child> …<![CDATA[…]]> </child> </root>
2)XML说明由cb10b296810f4b1110930157286263a5标关闭,其中包含版本、编码等可选说明,如:ffcca236b5b4d2a9b0601296378e26e8
3)XML文档说明由da89ff10afa4d0ddfda3f7547b6a98da关闭,如:b0562c0c44b641eeacc25e464572cc90
4)XML指令由dafd146137fc6183c98461e3ff33ba72关闭,如:e129ac797af2463f2cbe789c97735130
5)XML注释由8354a1e5146e9a755e153ddb81ac5ba9关闭,如:c23c4278524b7ca38649d0edb3b77a9e
6)XML元素由0c279c70298f1359892c735098ba7041打开,由/>,或5c5dfa63b92a4becdf0b976d58f1902a关闭,元素的打开和关闭标记相互匹配,如bf5181c8226ee8e19fd67e3f913eb780或1b01232ea6f0577bc4ec8d1a522b6a86…178733e97ec71b870a77daafc67e8e0b,XML的元素允许嵌套,应此还应保持层次上的匹配,如5c49c926bc487be6f96606df447708f4e663bf67d432875fde4c932efd4feaf7..48f80ac41c3449a2c0f73671e2cd7ccd6879c8de8c5e2889d23c06f516d46b6b。
7)CDTATA段由4bef20c9f836c1fb85f150a06f5b108c打开,由]]>关闭,用于使居于其中的语句规避XML解析规则。如:a5e1632744950887f801fb5daa65ae8c
根据以上的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 [28675c3d02b76e47536b84c673e04c48, &] /*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 = c10e08cd6a1cda3f9cd9924aa0807983
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中文网其他相关文章!