部分核心**如下:
first & follow
/*計算first集,u->xx...*/
void first(int u)
else
else
}j++;
}if(j >= p[i].rlength) /*當產生式右部都能推出空時*/
addfirst(u, -1);
} }}/*加入first集*/
void addfirst(int u, int nch) /*當數值小於100時nch為vt*/
/*當處理非終結符時,addfirst不新增空項(-1)*/
} if(null == pt)
else
pt = pt->next;
} }else
pt = pt->next;
} }}/*判斷first集中是否有空(-1)*/
bool h**eempty(int nvn)
return false;
}/*計算follow集,例:u->xvy,u->xv.(注:初始符必含#--"-1")*/
void follow(int v)
addfollow(v, p[i].lcursor, 0);
}else /*不為空時v->xvy,(注意:y->),呼叫addfollow加入vt或y的first集*/
if(null == pt) /*當後面的字元可以推出空時*/
addfollow(v, p[i].lcursor, 0);
}else /*發現不為空的字元時*/
}} }}/*當數值小於100時nch為vt*/
/*#用-1表示,kind用於區分是併入符號的first集,還是follow集
kind = 0表加入follow集,kind = 1加入first集*/
void addfollow(int v, int nch, int kind)
} if(null == pt)
else
pt = pt->next;
} }else /*為非終結符時,要區分是加first還是follow*/
}else
pt = pt->next;
}} }}/*輸出first或follow集*/
void showcollect(struct collectnode **collect)
else
printf(" #");
pt = pt->next;
} i++;
} printf("\n");
}/*計算first和follow*/
void firstfollow()
i = 0;
while('\0' != vn[i])
{ if(null == follow[i])
follow(100 + i);
編譯原理 語法分析
include include include include using namespace std define maxn 20000 int syn,p,sum,kk,m,n,row,error double dsum,pos char index 800 len 記錄指數形式的浮點數 cha...
詞法分析器
為給定程式語言設計詞法分析器 1 單詞結構 注釋 以 開頭到該行尾部為注釋 關鍵字 共6個 int real if then else while 識別符號 以字母開頭,後跟字母或數字的符號串,最長為64個字元。注意 關鍵字不是識別符號 操作符 共11個 分隔符 共5個 數字 用正規式描述 digi...
語法分析上機實習題
一 對於如下的文法,試編寫除錯乙個語法分析程式 程式 program 識別符號 分程式 分程式 變數說明 begin 語句表 end.變數說明 var 變數說明表 變數說明表 變數表 型別 變數表 型別 變數說明表 型別 integer real 變數表 變數 變數 變數表 語句表 語句 語句 語句...