.
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'.
预测分析算法的设计与实现



