|
编程手记之ANSI C篇-(四)XML解析自动机
在实现了通用连接件、哈希表和二叉分析树后,我可以用这些功能做一个XML分析工具了。XML以其标准的结构,严谨的文法,强大的描述能力,以及独立和开放性,在描述数据资源方面得到了广泛的应用。在各种语言中,XML文档(DOM)的分析工具已层出不穷,在此,从文法的角度,来完成一个XML分析自动机的C实现。
1、XML基本文法:
/*XML脚本有XML的声明和一个根结点构成*/
XMLScripts --> XMLNote XMLEntity
/*XML声明由XML标识首部、零个或多个XML属性节组成,之间空格符隔开,最后是XML标识尾部*/
XMLNote --> '<?xml' { BLANK XMLAttr} '?>'
/*XML节点由节点首部、节点文本、零个或多个子节点和节点尾部组成,没有文本、自节点的节点称为空节点*/
XMLEntity --> TagHead [ TagText {XMLEntity} TagTail ]
/*节点首部由节点开始符、节点名称、零个或多个属性节组成,没有文本和子节点的节点可由终止符后缀*/
TagHead --> '<' TagName {BLANK XMLAttr} [ '/>' | '' ]
/*节点文本由字符串组成*/
TagText --> {'a | b c| ...0 | 1 | ..'}
/*节点尾部由节点终止符和节点名称组成*/
TagTail --> '</' TagName '>'
/*节点名称由字符串组成*/
TagName --> {'a | b c| ...0 | 1 | ..'}
/*属性节属性名称、赋值符、首尾扩号和属性值组成*/
XMLAttr --> AttrName '=' '"' AttrValue '"'
/*属性名称由字符串组成*/
AttrName --> {'a | b c| ...0 | 1 | ..'}
/*属性值由字符串组成*/
AttrValue --> {'a | b c| ...0 | 1 | ..'}
/*空格符由下列符号组成*/
BLANK --> {' ' | '\t' | '\r' | '\n'}
2、XML解析自动机的定义:
/*定义自动机返回状态码*/
#define XP_SUCCESS 0
#define XP_CONTINUE 1
#define XP_ERROR -1
/*定义自动机当前的操作码*/
typedef enum{paChild = 0,paSibling = 1,paAttr = 2}XMLParseAction;
/*自动机器的数据结构*/
typedef struct tagXMLMac{
LINKPTR tree; /*二叉树用以维系节点关系和存储节点属性*/
LINKPTR parent; /*指向当前分析的父节点的,用于回溯*/
XMLParseAction act; /*当前自动机操作码*/
int retcode; /*自动机状态码*/
TCHAR* token; /*当前分析位置的字符串指针*/
}XMLMac;
/*定义一些节点的固有属性*/
#define NODENAME _T("NodeName")
#define NODETEXT _T("NodeText")
#define NODETYPE _T("NodeType")
[1] [2] [3] [4] [5] [6] 下一页
|