XML 文法分析を実行する前に、まず XML 構文の基本規則を理解する必要があります:
字句の特徴: 1) XML では大文字と小文字が区別されます。たとえば、要素名は開始タグと終了タグで大文字と小文字が区別される必要があります。2) XML 記述は マークによって閉じられます。これには、次のようなバージョンやエンコーディングなどのオプションの記述が含まれます。 「UTF-9」? >
3) XML ドキュメント命令は で閉じます。例: 4) XML 命令は、 と予約された文字列で開かれ、?> で閉じられます。例: 5) XML コメント によって開かれます。たとえば、 6) XML 要素は <要素名> によって開かれ、閉じられます。 /> または 要素名> によって、要素は開始タグと終了タグが相互に一致します (
上記の XML 文法特徴に基づいて、字句解析用の正規表現と構文解析用のプッシュダウンをオートマトン構造で構築できます。
XML字句正規表現:
#define digit [1,2,…,9] /*数字*/
#definecharacter [a,b,…,z,A,B,…,Z] /*英字*/
#define 記号 [~, ! , @, #, %, ^, &,*,(, ), ?, :, ;, “, ', ,, ., /,-, _, +, = , |, /] /*記号文字*/
#define ascii2 [0x80,…,0xFF] /*ASCIIチャート2拡張文字*/
#define space [0x20, /t, /r, /n] /*スペース文字、タブ文字、復帰文字、改行文字 */
#definereserve [<, >, &] /*XML予約文字*/
1)要素名の正規表現:
element_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
element_text -> (ε| not reserve)*
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文法の解析にはプッシュダウンオートマトンの構築が必要、その構造は次のように定義されます:
2) スタックトップシンボルセットは、現在の分析ノード:Q: {…} /*详见后面的状态集合*/ Σ: /*指向待解析的XML元素词串*/ σ: Q×Σ->Q /*状态转移函数,见状态转移列表*/ q: {NIL_SKIP} /*初始状态*/ Γ: {NIL_FAILED,NIL_SUCCEED} /*终结状态集合*/ S: {Q/*状态*/, N/*DOM节点*/>,<…>} /*下推栈*/ログイン後にコピー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界段结束*/ログイン後にコピー以上がWebプログラミング ~XML文法解析の詳しい解説~の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。