語法分析器

2023-02-09 02:18:02 字數 1425 閱讀 3854

部分核心**如下:

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 變數表 變數 變數 變數表 語句表 語句 語句 語句...