📄 final.c
字号:
char * gettoken( int Method,char * p[] )
{static int c = 1;
switch(Method)
{
case 1:
return p[c++];
case -1:
return p[--c];
}
}
int lookupid( char * p, char * q[], int r )
{
int c, w;
c = 0;
for ( w = 1; w <= r; w++ )
{
if ( strcmp( p, q[w] ) == 0 )
c = 1;
}
return c;
}
char * lookupkey( char * p, char * q[16] )
{
int m;
char * r;
r = "0";
for ( m = 0; m <= 15; m++ )
{
if ( strcmp( p, q[m] ) == 0 ) r = q[m];
}
return ( r );
}
void output( int i, char * p ) /* 输出识别后的2元组表示 */
{
FILE * fp1;
char showname[20];
fp1 = fopen( "b.c", "a" );
switch ( i )
{
case 1:
strcpy( showname, "id" );
break;
case 2:
strcpy( showname, "int" );
break;
case 3:
strcpy( showname, "key" );
break;
case 4:
strcpy( showname, "less than" );
break;
case 5:
strcpy( showname, "less or equal" );
break;
case 6:
strcpy( showname, "greater or equal" );
break;
case 7:
strcpy( showname, "greaterthan" );
break;
case 8:
strcpy( showname, "equal" );
break;
case 9:
strcpy( showname, "leftbrackt" );
break;
case 10:
strcpy( showname, "rightbrackt" );
break;
case 11:
strcpy( showname, "leftBbrackt" );
break;
case 12:
strcpy( showname, "rightBbrackt" );
break;
case 13:
strcpy( showname, "add" );
break;
case 14:
strcpy( showname, "subtract" );
break;
case 15:
strcpy( showname, "multiply" );
break;
case 16:
strcpy( showname, "divide" );
break;
case 17:
strcpy( showname, "semicolon" );
break;
case 18:
strcpy( showname, "assign" );
break;
}
fprintf( fp1, "<%s,%s>\n", showname, p );
fclose( fp1 );
}
void syntaxanalyse(char *t[],int r, char * p[] )
{
if ( strcmp( gettoken(1, p ), "main" ) == 0)
{
;
}
else
{
printf("spelling mistake of 'main'OR 'main' missing!\n ");
return;
}
if( strcmp( gettoken(1, p ), "(" ) == 0 )
{
;
}
else
{
printf("'(' missing!\n");
return;
}
if(strcmp( gettoken(1, p ), ")" ) != 0)
{
printf("')' missing!\n");
return;
}
else
{ ;
}
if (strcmp( gettoken(1, p ), "{" ) != 0 )
{
printf("'{' missing!\n");
return;
}
else
{ ;
}
procedure( t,r,p );
if ( strcmp( gettoken( 1,p ), "}" ) == 0 )
printf( "Syntax test passed,This is a legal program.\n" );
else
{
printf( "'}' missing!\n" );
return;
}
}
void procedure( char *t[],int r,char * p[] )
{
definition( t,r,p );
assignment( t,r,p );
condition( t,r,p );
}
void definition( char *t[],int r,char * p[] )
{ char *q;
if ( strcmp( gettoken(1, p ), "int" ) == 0 )
{ q=gettoken(1, p );
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( strcmp( gettoken(1, p ), ";" ) == 0 )
definition( t,r,p );
else
printf( "';' missing!\n" );
}
}
void assignment( char *t[],int r,char * p[] )
{ char *q;
q=gettoken(-1,p);
if ( idcheck( t,r,q ) )
{ gettoken(1,p);
if ( strcmp( gettoken(1, p ), "=" ) == 0 )
{
if ( numbercheck( p ) )
{
if ( strcmp( gettoken(1, p ), ";" ) == 0 )
{
gettoken(1,p);
assignment( t,r,p );
}
else
printf( "';' missing!\n" );
}
else
printf( "Syntax error!\n" );
}
else
{ ;
}
}
else
{ ;
}
}
void condition( char *t[],int r,char * p[] )
{ char *q;
if ( strcmp( gettoken(1, p ), "if" ) == 0 && strcmp( gettoken( 1,p ), "(" ) == 0 )
{ ;
}
else
printf("Not a condition statments!\n");
q=gettoken(1,p);
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( opcheck( p ) )
{ ;
}
else
printf("Syntax error!\n");
q=gettoken(1,p);
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( strcmp( gettoken( 1,p ), ")" ) == 0 )
{ ;
}
else
printf("')' missing!\n");
q=gettoken(1,p);
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( strcmp( gettoken( 1,p ), "=" ) == 0 )
{ ;
}
else
printf("Syntax error!\n");
q=gettoken(1,p);
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( opcheck( p ) )
{ ;
}
else
printf("Syntax error!\n");
q=gettoken(1,p);
if ( idcheck( t,r,q ) )
{ ;
}
else
printf("Variable not defined!\n");
if ( strcmp( gettoken( 1,p ), ";" ) == 0 )
{ ;
}
else
printf("';' missing!\n");
}
int idcheck( char * t[],int r, char * q )
{
int i, c = 0;
for ( i = 1; i <= r; i++ )
{
if ( strcmp( q, t[i] ) == 0 )
c = 1;
}
return c;
}
int opcheck( char * p[] )
{
int c = 0;
char *q;
q = gettoken( 1,p );
if ( strcmp( q, "+" ) == 0 || strcmp( q, "-" ) == 0 || strcmp( q, "*" ) == 0 || strcmp( q, "/" ) == 0
||strcmp( q, ">")==0 ||strcmp( q, ">=")==0||strcmp( q, "<")==0||strcmp( q, "<=")==0||strcmp( q, "==")==0)
c = 1;
return c;
}
int numbercheck( char * p[] )
{
int c = 0;
char *q;
q = gettoken( 1,p );
if ( strcmp( q, "0" ) == 0 || strcmp( q, "1" ) == 0 || strcmp( q, "2" ) == 0 || strcmp( q, "3" ) == 0
|| strcmp( q, "4" ) == 0 || strcmp( q, "9" ) == 0 || strcmp( q, "8" ) == 0 || strcmp( q, "7" ) == 0
|| strcmp( q, "6" ) == 0 || strcmp( q, "5" ) == 0 )
c = 1;
return c;
}
int switchnumber(char *p[],int i)
{
if(strcmp(p[i],"0")==0)return 0;
else if(strcmp(p[i],"1")==0)return 1;
else if(strcmp(p[i],"2")==0)return 2;
else if(strcmp(p[i],"3")==0)return 3;
else if(strcmp(p[i],"4")==0)return 4;
else if(strcmp(p[i],"5")==0)return 5;
else if(strcmp(p[i],"6")==0)return 6;
else if(strcmp(p[i],"7")==0)return 7;
else if(strcmp(p[i],"8")==0)return 8;
else if(strcmp(p[i],"9")==0)return 9;
}
int calculate(int a, int b,char *p[])
{
int c;
if(strcmp(p[31],"+")==0)return (a+b);
if(strcmp(p[31],"-")==0)return (a-b);
if(strcmp(p[31],"*")==0)return (a*b);
if(strcmp(p[31],"/")==0)return (a/b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -