📄 new7-6.c
字号:
p=insert("*=",operater);
else
{p=insert("*",TIMES);
ungetc(t,fp);
}
}
break;
case '/':
{ t=fgetc(fp);
if(t=='*') /*判断注释*/
{
while(1){
t=fgetc(fp);
if(feof(fp))
{
printf("/*error!*/");
fprintf(outp,"/*error!*/");
getch();
exit(0);
}
else if(t=='*')
{
t=fgetc(fp);
if(feof(fp))
{
printf("/*error!*/");
fprintf(outp,"/*error!*/");
getch();
exit(0);
}
else if(t=='/')
return lexan();
}
}
}
else if(t=='=')
p=insert("/=",operater);
else
{ungetc(t,fp);
p=insert("/",OVER);}
}
break;
case '=':
{
t=fgetc(fp);
if(t=='=')
p=insert("==",EQA);
else
{p=insert("=",EQ);
ungetc(t,fp);
}
}
break;
case '>':
{ t=fgetc(fp);
if(t=='=')
p=insert(">=",RE);
else
{
p=insert(">",RT);
ungetc(t,fp);
}
}
break;
case '<':
{ t=fgetc(fp);
if(t=='=')
p=insert("<=",LE);
else if(t=='>')
p=insert("<>",operater);
else
{
p=insert("<",LT);
ungetc(t,fp);
}
}
break;
case '%':
p=insert("%",sign);
break;
case '!':
{
t=fgetc(fp);
if(t=='=')
p=insert("!=",NOTEQUEL);
else
{p=insert("!",sign);
ungetc(t,fp);
}
}
break;
case '~':
p=insert("~",sign);
break;
case '^':
p=insert("^",sign);
break;
case '.':
p=insert(".",sign);
break;
case '?':
p=insert("?",sign);
break;
case ':':
{
t=fgetc(fp);
if(t=='=')
p=insert(":=",operater);
else
{p=insert(":",operater);
ungetc(t,fp);
}
}
break;
case ',':
p=insert(",",COMMA);
break;
case ';':
p=insert(";",SEMI);
break;
case '\"':
p=insert("\"",sign);
break;
case '\'':
p=insert("\'",sign);
break;
case '{':
p=insert("{",LH);
break;
case '}':
p=insert("}",RH);
break;
case '[':
p=insert("[",LBcircle);
break;
case ']':
p=insert("]",RBcircle);
break;
case '(':
p=insert("(",Lcircle);
break;
case ')':
p=insert(")",Rcircle);
break;
case '#':
p=insert("#",sign);
break;
case '@':
p=insert("@",sign);
break;
case '$':
p=insert("$",sign);
break;
case '&':
{
t=fgetc(fp);
if(t=='&')
p=insert("&&",sign);
else
{p=insert("&",sign);
ungetc(t,fp);
}
}
break;
case '_':
p=insert("_",sign);
break;
case '|':
{
t=fgetc(fp);
if(t=='|')
p=insert("||",sign);
else
{p=insert("|",sign);
ungetc(t,fp);
}
}
break;
case '\\':
p=insert("\\",sign);
break;
default:
{printf("Error string!");
fprintf(outp,"Error string!");
fprintf(errorp,"Error string!");}
}
tokenval=p;
return symtable[p].token;
}
else
{
tokenval=NONE;
return t;
}
}
/********************************************************/
/* 编译原理实验 */
/* 作者:软件四班王磊 */
/* 学号:1023710411 */
/* 实现功能语法分析 */
/* 插入语义动作实现语法制导翻译 */
/*********************************************************/
/***************************语法分析函数***************************************/
prase() /*--语法分析--*/
{
lookahead=lexan();
while(lookahead!=DONE)
{
fprintf(exp,"Program begin \n");
declaration_list();
}
printf("Translate and edit over, see files for detail!\n ");
fprintf(exp,"\nTranslate and edit over, see files for detail!\n ");
fprintf(yuyip,"Function end\n");
}
declaration_list() /*--函数声明部分--*/
{
fprintf(exp,"Declaration part \n");
declaration();
while(lookahead!=DONE)
{
fprintf(exp,"\nDeclaration part \n");
declaration();
}
return;
}
declaration()
{
char *m,*n;
y: if(lookahead==17||lookahead==30)
{
if(lookahead==17)
{fprintf(exp,"type_specifier ");/*emit(17,NONE);*/match(17);strcpy(m,"int");}
else
{fprintf(exp,"type_specifier ");/*emit(30,NONE);*/match(30);strcpy(m,"void");}
strcpy(stringi,m);
if(lookahead==ID)
{
/* emit(ID, tokenval); */
strcpy(n,symtable[tokenval].lexptr);
match(ID);
if(lookahead==Lcircle) /*--声明函数体如main()--*/
{
fprintf(yuyip,"Fun_declaration\n");
fprintf(yuyip," Function: %s\n",n);
fprintf(yuyip," Return type: %s\n",m);
fprintf(exp,"\nFunction declaration \n");
fun_declaration();}
else if(lookahead==SEMI||lookahead==LBcircle||lookahead==COMMA)
{
if(lookahead==SEMI)
fprintf(yuyip,"%s %s\n",m,n);
if(lookahead==LBcircle)
fprintf(yuyip,"%s %s",m,n);
if(lookahead==COMMA)
fprintf(yuyip,"%s %s\n",m,n);
fprintf(exp,"\nVariable declaration \n");
fprintf(exp,"%s %s",m,n);
ainsert(m,17); ainsert(n,ID);
var_declaration();} /*--如声明int a--*/
else {error("Var_declaration miss match ;\n");goto y;}
/*--识别少;的情况(错误处理)--*/
}
}
return;
}
var_declaration()
{
char *n,*q;
if(lookahead==LBcircle)
{
emit(LBcircle,NONE);ainsert("[",LBcircle);match(LBcircle);
emit(NUM,tokenval);strcpy(n,symtable[tokenval].lexptr);ainsert(n,NUM);match(NUM);
emit(RBcircle,NONE);ainsert("]",RBcircle);match(RBcircle);
fprintf(yuyip,"[ %s ]\n",n);
}
while(lookahead==COMMA)
{
emit(COMMA,NONE);
match(COMMA);
emit(ID, tokenval);
strcpy(q,symtable[tokenval].lexptr);
ainsert(q,ID);
match(ID);
fprintf(yuyip,"%s %s\n",stringi,q);
}
emit(SEMI,NONE);
match(SEMI); fprintf(exp,"\n");
if(lookahead==17||lookahead==30)
declaration();
return;
}
fun_declaration()
{
emit(Lcircle,NONE);match(Lcircle);
if(lookahead!=Rcircle)
params(); /*--函数参数声明--*/
if(lookahead!=Rcircle)
{error("Fun_declaration miss match )\n"); goto z;}
emit(Rcircle,NONE);match(Rcircle);
z: compound_stmt();
return;
}
params()
{
char *m,*n;
if(lookahead==17||lookahead==30)
{
if(lookahead==17)
{fprintf(exp,"\ninter type_specifier \n");emit(17,NONE);match(17);strcpy(m,"int");}
else
{fprintf(exp,"\ninter type_specifier \n");emit(30,NONE);match(30);strcpy(m,"void");}
}
if(lookahead==ID)
{
emit(ID, tokenval);
strcpy(n,symtable[tokenval].lexptr);
match(ID);
fprintf(yuyip,"Inter type_specifier \n");
fprintf(yuyip,"%s %s",m,n);
if(lookahead==LBcircle)
{emit(LBcircle,NONE);match(LBcircle);
emit(RBcircle,NONE);match(RBcircle);
fprintf(yuyip,"[]\n",m,n);}
if(lookahead==COMMA)
{emit(COMMA,NONE);match(COMMA);params();}
fprintf(yuyip,"\n");
}
return;
}
compound_stmt() /*--函数体识别部分--*/
{
fprintf(yuyip,"Function begin\n");
fprintf(exp,"\nCompound_statement\n");
emit(LH,NONE);match(LH);
local_declarations();
statement_list();
if(lookahead!=RH)
{error("Compound_stmd miss match }\n"); goto y;} /*--识别复合语句少}--*/
emit(RH,NONE);match(RH);
y: return;
}
local_declarations() /*--函数体声明--*/
{
if(lookahead==17||lookahead==30)
{ fprintf(exp,"\nLocal_declarations \n");
declaration();
}
return;
}
statement_list() /*--函数体语句--*/
{
if(lookahead!=RH&&lookahead!=DONE)
{ fprintf(exp,"\nStatement \n");
statement();
while(lookahead!=RH&&lookahead!=DONE)
{fprintf(exp,"\nStatement \n");
statement();}
}
return;
}
statement() /*--四种语句的识别--*/
{
switch(lookahead)
{ /*--if--*/
case 16:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -