肯定有穷自动机解析内核[VC/C++编程]
本文“肯定有穷自动机解析内核[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
前些时刻学习编译原理,同时也为 DocWizard 做词法解析技术的预备,于是便想出了一种词法解析内核.这个解析内核可以在不改变代码的情形下解析差别的 DFA.
解析器的基本构造
如图一所示,脚本 Scripts 进入解析内核 ParsingKernel,解析内核按照 DFA 法则作词法解析,生成单词序列 WordsSequence.
图一
此中的 DFA Rules 其实就是 DFA 中的状况转换法则.解析内核在工作时需求查阅法则表.只要改换这个法则表,便可以解析差别的词法.
工作原理
例子程序中的 CStateChangeRule 代表一条转换法则.它由以下三个数据构成:
当前状况编号:int nCurState
下一个状况编号:int nNextState
需求匹配的字符:CHAR_RANGE route[ROUTE_BUF_LEN]
内核在刚开始工作的时刻,设定当前状况为 0,然后对输入字符串 pszLine 举行扫描.Route()函数按照当前需求处理的字符和当前状况,计算出下一个状况.Accept()函数负责接纳一个单词.
void CAjaxParserDlg::OnParse()
{
char *pszLine = " void CAjaxParserDlg::OnParse() +12.3 12.3 -12.3 -.12 +.12 .12 +12. -12. 12. .023 ";
int i=0, nLen, nState=0, nNext=-1, nStart;
nLen = strlen(pszLine);
while(i<nLen)
{
if(nState==0)
{
nStart = i;
}
nNext = Route(nState, *(pszLine+i));
Accept(nState, nNext, pszLine+nStart, i-nStart);
if(!(nState!=0 && nNext==0))
i++;
nState = nNext;
}
Accept(nState, 0, pszLine+nStart, i-nStart);
}
以上是“肯定有穷自动机解析内核[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |