编译原理-LL(1)文法源代码(实验三) 联系客服

发布时间 : 星期六 文章编译原理-LL(1)文法源代码(实验三)更新完毕开始阅读bf2cc3195122aaea998fcc22bcd126fff6055d30

;

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; 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';

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; }

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) {