LL1语法分析器实验报告(2)

2019-08-31 23:41

{

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集*/


LL1语法分析器实验报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浅析农业银行人力资源管理存在的问题及几点建议

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: