.
预测分析算法的设计与实现
程序代码:
#include \#include \
#define MaxRuleNum 8 #define MaxVnNum 5 #define MaxVtNum 5 #define MaxStackDepth 20 #define MaxPLength 20 #define MaxStLength 50
struct pRNode /*产生式右部结构*/ {
int rCursor;
struct pRNode *next; };
struct pNode {
int lCursor;
int rLength; /*右部长度*/
struct pRNode *rHead; /*右部结点头指针*/ };
char Vn[MaxVnNum + 1]; /*非终结符集*/ int vnNum;
char Vt[MaxVtNum + 1]; /*终结符集*/ int vtNum;
struct pNode P[MaxRuleNum]; int PNum;
char buffer[MaxPLength + 1];
1 / 24'.
.
char ch;
char st[MaxStLength]; /*要分析的符号串*/
struct collectNode {
int nVt;
void ShowAT();/*输出分析表*/ void Identify(char *st); void InitStack(); void ShowStack(); void Pop(); void Push(int r);
int main() {
char todo,ch; Init(); InputVn(); InputVt(); InputP(); getchar(); FirstFollow();
printf(\所得first集为:\ ShowCollect(first);
printf(\所得follow集为:\ ShowCollect(follow); CreateAT(); ShowAT(); todo = 'y';
while('y' == todo) {
printf(\是否继续进行句型分析?(y / n):\ todo = getchar();
while('y' != todo && 'n' != todo) {
printf(\ todo = getchar(); }
2 / 24'.
.
if('y' == todo) { int i; InitStack();
printf(\请输入符号串(以#结束) : \ ch = getchar(); i = 0;
while('#' != ch && i < MaxStLength) {
st[i] = ch; Identify(st); } else
printf(\输入出错!\\n\ } }
getchar(); }
void Init() {
int i,j; vnNum = 0; vtNum = 0; PNum = 0;
for(i = 0; i <= MaxVnNum; i++) Vn[i] = '\\0';
for(i = 0; i <= MaxVtNum; i++) Vt[i] = '\\0';
for(i = 0; i < MaxRuleNum; i++) {
P[i].lCursor = NULL; P[i].rHead = NULL; P[i].rLength = 0; }
PNum = 0;
for(i = 0; i <= MaxPLength; i++) }
3 / 24'.
.
}
int IndexCh(char ch) { int n;
n = 0; /*is Vn?*/
while(ch != Vn[n] && '\\0' != Vn[n]) n++;
if('\\0' != Vn[n]) return 100 + n; n = 0; /*is Vt?*/
while(ch != Vt[n] && '\\0' != Vt[n]) n++;
if('\\0' != Vt[n]) return n; return -1; }
/*输出Vn或Vt的内容*/
void ShowChArray(char* collect) {
int k = 0;
while('\\0' != collect[k]) {
printf(\ }
printf(\}
/*输入非终结符*/ void InputVn() { {
Vn[n++] = '\\0'; } n = 0;
while(('#' != ch) && (n < MaxVnNum)) {
if(' ' != ch && '\\n' != ch && -1 == IndexCh(ch)) {
4 / 24'.
.
Vn[n++] = ch; vnNum++; }
ch = getchar(); }
Vn[n] = '#'; /*以\标志结束用于判断长度是否合法*/ k = n; if('#' != ch) {
if( '#' != (ch = getchar())) {
while('#' != (ch = getchar())) ;
printf(\符号数目超过限制!\\n\ inErr = 1; continue; } {
printf(\输入正确确认?(y/n):\ }
scanf(\ }
if('n' == ch) {
printf(\录入错误重新输入!\\n\ inErr = 1; } else {
inErr = 0; } } }
/*输入终结符*/ void InputVt() {
int inErr = 1; int n,k;
5 / 24'.