{
Vn[n++] = ch; vnNum++; }
ch = getchar(); }
Vn[n] = '#'; /*以“#”标志结束用于判断长度是否合法*/ k = n; /*k用于记录n以便改Vn[n]='\\0'*/ if('#' != ch) {
if( '#' != (ch = getchar())) {
while('#' != (ch = getchar())) ;
printf(\符号数目超过限制!\\n\ inErr = 1; continue; } }
/*正确性确认,正确则,执行下下面,否则重新输入*/ Vn[k] = '\\0'; ShowChArray(Vn); ch = ' ';
while('y' != ch && 'n' != ch) {
if('\\n' != ch) {
printf(\输入正确确认?(y/n):\ }
scanf(\ }
if('n' == ch) {
printf(\录入错误重新输入!\\n\ inErr = 1; } else {
inErr = 0; } } }
/*输入终结符*/ void InputVt()
{
int inErr = 1; int n,k; char ch; while(inErr) {
printf(\请输入所有的终结符,注意:\ printf(\以#号结束:\\n\ ch = ' '; n = 0;
/*初始化数组*/
while(n < MaxVtNum) {
Vt[n++] = '\\0'; }
n = 0;
while(('#' != ch) && (n < MaxVtNum)) {
if(' '!= ch && '\\n' != ch && -1 == IndexCh(ch)) {
Vt[n++] = ch; vtNum++; }
ch = getchar(); }
Vt[n] = '#'; /*以“#”标志结束*/
k = n; /*k用于记录n以便改Vt[n]='\\0'*/ if('#' != ch) {
if( '#' != (ch = getchar())) {
while('#' != (ch = getchar())) printf(\符号数目超过限制!\\n\ inErr = 1; continue; } }
/*正确性确认,正确则,执行下下面,否则重新输入*/ Vt[k] = '\\0'; ShowChArray(Vt); ch =' ';
while('y' != ch && 'n' != ch) {
if('\\n' != ch)
{
printf(\输入正确确认?(y/n):\ }
scanf(\ }
if('n' == ch) {
printf(\录入错误重新输入!\\n\ inErr = 1; } else {
inErr = 0; } } }
/*产生式输入*/ void InputP() {
char ch;
int i = 0, n,num;
printf(\请输入文法产生式的个数:\ scanf(\ PNum = num;
getchar(); /*消除回车符*/
printf(\请输入文法的%d个产生式,并以回车分隔每个产生式:\ printf(\ while(i < num) {
printf(\第%d个:\ /*初始化*/
for(n =0; n < MaxPLength; n++) buffer[n] = '\\0'; /*输入产生式串*/ ch = ' '; n = 0;
while('\\n' != (ch = getchar()) && n < MaxPLength) {
if(' ' != ch)
buffer[n++] = ch; }
buffer[n] = '\\0';
/* printf(\ if(CheckP(buffer))
{
/*填写入产生式结构体*/ pRNode *pt, *qt;
P[i].lCursor = IndexCh(buffer[0]); pt = (pRNode*)malloc(sizeof(pRNode)); pt->rCursor = IndexCh(buffer[3]); pt->next = NULL; P[i].rHead = pt; n = 4;
while('\\0' != buffer[n]) {
qt = (pRNode*)malloc(sizeof(pRNode)); qt->rCursor = IndexCh(buffer[n]); qt->next = NULL; pt->next = qt; pt = qt; n++; }
P[i].rLength = n - 3; i++;
/*调试时使用*/ } else
printf(\输入符号含非法在成分,请重新输入!\\n\ } }
/*判断产生式正确性*/ bool CheckP(char * st) {
int n;
if(100 > IndexCh(st[0])) return false; if('-' != st[1]) return false; if('>' != st[2]) return false;
for(n = 3; '\\0' != st[n]; n ++) {
if(-1 == IndexCh(st[n])) return false; }
return true; }
/*====================first & follow======================*/
/*计算first集,U->xx...*/ void First(int U) {
int i,j;
for(i = 0; i < PNum; i++) {
if(P[i].lCursor == U) {
struct pRNode* pt; pt = P[i].rHead; j = 0;
while(j < P[i].rLength) {
if(100 > pt->rCursor) {
/*注:此处因编程出错,使空产生式时
rlength同样是1,故此处同样可处理空产生式*/ AddFirst(U, pt->rCursor); break; } else {
if(NULL == first[pt->rCursor - 100]) {
First(pt->rCursor); }
AddFirst(U, pt->rCursor); if(!HaveEmpty(pt->rCursor)) {
break; } else {
pt = pt->next; } } j++; }
if(j >= P[i].rLength) /*当产生式右部都能推出空时*/ AddFirst(U, -1); } } }
/*加入first集*/