好文档 - 专业文书写作范文服务资料分享网站

预测分析算法的设计与实现

天下 分享 时间: 加入收藏 我要投稿 点赞

.

Follow(100 + i); i++; } }

/*构造预测分析表*/ void CreateAT() { int i;

struct pRNode *pt; struct collectNode *ct; for(i = 0; i < PNum; i++) {

pt = P[i].rHead;

while(NULL != pt && HaveEmpty(pt->rCursor)) {

ct = first[pt->rCursor - 100]; while(NULL != ct) {

if(-1 != ct->nVt)

analyseTable[P[i].lCursor - 100][ct->nVt] = i; ct = ct->next; }

pt = pt->next; }

if(NULL == pt) {

ct = follow[P[i].lCursor - 100]; while(NULL != ct) {

if(-1 != ct->nVt)

analyseTable[P[i].lCursor - 100][ct->nVt] = i; else

analyseTable[P[i].lCursor - 100][vtNum] = i; ct = ct->next; } } else {

16 / 24'.

.

if(100 <= pt->rCursor) /*不含空的非终结符*/ {

ct = first[pt->rCursor - 100]; while(NULL != ct) {

analyseTable[P[i].lCursor - 100][ct->nVt] = i; ct = ct->next; } }

else /*终结符或者空*/ {

if(-1 == pt->rCursor) {

ct = follow[P[i].lCursor - 100]; while(NULL != ct) {

if(-1 != ct->nVt)

analyseTable[P[i].lCursor - 100][ct->nVt] = i; else /*当含有#号时*/

analyseTable[P[i].lCursor - 100][vtNum] = i; ct = ct->next; } }

else /*为终结符*/ {

analyseTable[P[i].lCursor - 100][pt->rCursor] = i; } } } } }

/*输出分析表*/ void ShowAT() {

int i,j;

printf(\构造预测分析表如下:\\n\ printf(\

for(i = 0; i < vtNum; i++)

17 / 24'.

.

{

printf(\ }

printf(\

printf(\ for(i = 0; i <= vtNum; i++) printf(\ printf(\

for(i = 0; i < vnNum; i++) {

printf(\ for(j = 0; j <= vtNum; j++) {

if(-1 != analyseTable[i][j])

printf(\ else

printf(\ }

printf(\ } }

void Identify(char *st) {

int current,step,r; /*r表使用的产生式的序号*/ printf(\的分析过程:\\n\

printf(\步骤\\t分析符号栈\\t当前指示字符\\t使用产生式序号\\n\ step = 0; current = 0;

printf(\ ShowStack();

printf(\ while('#' != st[current]) {

if(100 > analyseStack[topAnalyse]) {

if(analyseStack[topAnalyse] == IndexCh(st[current]))

18 / 24'.

.

{ Pop(); current++; step++;

printf(\ ShowStack();

printf(\出栈、后移\\n\ } else {

printf(\不匹配!\ printf(\此串不是此文法的句子!\\n\ return; } }

else /*当为非终结符时*/ { r

=

analyseTable[analyseStack[topAnalyse]

-

100][IndexCh(st[current])]; if(-1 != r) {

Push(r); step++;

printf(\ ShowStack();

printf(\ } else {

printf(\此串不是此文法的句子!\\n\ return; } } }

if('#' == st[current]) {

if(0 == topAnalyse && '#' == st[current]) {

19 / 24'.

.

step++;

printf(\ ShowStack();

printf(\分析成功!\\n\ printf(\是给定文法的句子!\\n\ } else {

while(topAnalyse > 0) {

if(100 > analyseStack[topAnalyse]) {

printf(\此串不是此文法的句子!\\n\ return; } else {

r = analyseTable[analyseStack[topAnalyse] - 100][vtNum]; if(-1 != r) {

Push(r); /*产生式右部代替左部,指示器不移动*/ step++;

printf(\ ShowStack();

if(0 == topAnalyse && '#' == st[current]) {

printf(\分析成功!\\n\ printf(\是给定文法的句子!\\n\ }

else

printf(\ } else {

printf(\此串不是此文法的句子!\\n\ return; } }

20 / 24'.

1udi3733in7yqpo85se79mzf00wrvr00ivk
领取福利

微信扫码领取福利

微信扫码分享