Avant d'effectuer une analyse grammaticale XML, il est d'abord nécessaire de comprendre les règles de base de la syntaxe XML :
Caractéristiques lexicales : 1) XML est sensible à la casse, comme les noms d'éléments dans balises d'ouverture et de fermeture Les majuscules et les minuscules doivent être cohérentes
2) Les caractères de marque réservés XML sont : < > Le symbole
%20Caract%C3%A9ristiques%20syntaxiques%20:%201)%20Un%20document%20XML%20se%20compose%20d'une%20description%20XML,%20de%20plusieurs%20
descriptions%20de%20documents%20facultatives,%20de%20plusieurs%20directives%20XML%20facultatives,%20de%20plusieurs%20commentaires%20XML%20facultatifs%20et%20d'un%20corps%20de%20donn%C3%A9es%20de%20l'%C3%A9l%C3%A9ment%20racine.%20De%20plus,%20le%20CDATA%20peut%20%C3%AAtre%20int%C3%A9gr%C3%A9.%20segment%20dans%20l'instruction,%20tel%20que%C2%A0:%20
2) La description XML est ouverte par , qui contient des descriptions facultatives telles que la version et l'encodage, telles que : xml version=”1.0” encoding=”UTF-9”?><?xml …?> /*XML说明*/ <!DOCTYPE …> /*XML文档说明*/ <!-- … --> /*XML注释*/ <?xml-stylesheet …?> /*XML指令*/ <root> /*根数据元素*/ <child> …<![CDATA[…]]> </child> </root>
4) Les instructions XML sont ouvertes par et des chaînes réservées, et fermées par ?>, telles que :
5) Les commentaires XML sont ouverts par , tels que :
6) Les éléments XML sont ouverts par < element name >Opened by />, ou , les balises d'ouverture et de fermeture de l'élément correspondent, telles que
Sur la base des fonctionnalités de grammaire XML ci-dessus, des expressions régulières pour l'analyse lexicale et l'analyse syntaxique peuvent être construites. Structure d'automate pushdown .
Expression régulière lexicale XML :
#define digit [1,2,…,9] /*Caractère numérique*/
#define letter [a,b,…,z,A,B,…, Z] /*Caractères alphabétiques*/
#définir les signes [~, !, @, #, %, ^, &,*,(, ), ?, :, ;, “, ', ,, ., / ,-, _, +, =, |, /] /*Caractère symbole*/
#define ascii2 [0x80,…,0xFF] /*Caractère étendu du tableau ASCII2*/
#define space [0x20, / t, /r, /n] /*Caractère espace, caractère de tabulation, caractère de retour chariot, caractère de saut de ligne*/
#define reserve [<, >, &] /*Caractères réservés XML*/
1) Expression régulière du nom de l'élément :
element_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
element_text -> (ε| not reserve)*
proper_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
proper_value -> (ε| not reserve)*
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)*
1) STACK_DFA mata_xml_doc =
Q: {…} /*详见后面的状态集合*/ Σ: /*指向待解析的XML元素词串*/ σ: Q×Σ->Q /*状态转移函数,见状态转移列表*/ q: {NIL_SKIP} /*初始状态*/ Γ: {NIL_FAILED,NIL_SUCCEED} /*终结状态集合*/ S: {Q/*状态*/, N/*DOM节点*/>,<…>} /*下推栈*/
T:{NIL/*空*/, TG/*标记*/, NS/*元素*/, IS/*指令*/, DS/*声明*/, CD/*CDATA界段*/,CM/*注释*/}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!