📄 wen.c
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,k;
double sum;
int inte,sign,tmp;
char *rwtab[6]={"begin","if","then","while", "do","end"};
void e();
void t();
void f();
void scaner();
int isLetter(char);
int isDigit(char);
void error();
int isLetter(char c)
{
if( (c>='a' && c<='z') || (c>='A' && c<='Z') ) return 1;
else return 0;
}
int isDigit(char c)
{
if(c>='0' && c<='9') return 1;
else return 0;
}
void error()
{
printf("\n It is error!\n");
syn=0;
}
void e()
{ t();
while (syn==13||syn==14)
{
scaner();
t();
}
}
void t( )
{ f();
while(syn==15||syn==16)
{
scaner();
f();
}
}
void f()
{ if (syn==10||syn==11||syn==12||syn==29)
scaner();
else if (syn==27)
{
scaner();
e();
if (syn==28)
scaner();
else k=0;
}
else k=0;
}
void scaner( )
{
double s=0; /*s为小数点后的数*/
int n,i=0;
char ch1; /*i为小数点后位数*/
for ( n=0; n<8; n++ )
token[n]='\0'; /*置空 */
ch=prog[p++];
while (ch==' ') ch=prog[p++] ; /*跳过空格*/
if(ch=='+'||ch=='-')
{
if(ch=='+') tmp=1;
else tmp=-1;
if(syn==10||syn==11||syn==12||syn==29||syn==28)
{ if(ch=='+'){syn=13; token[0]=ch;}
else {syn=14; token[0]=ch; }
}
else
{ ch=prog[p++];/*读入下一个字符*/
while (ch==' ') ch=prog[p++] ;/*忽略空格*/
if(isDigit(ch))
{
sign=tmp;
p--;
scaner();
sign=1;
}
else
{
p--;
if(tmp==1){syn=13; token[0]='+';}
else {syn=14; token[0]='-'; }}
}
}
else if(isLetter(ch))
{
m=0;
while(isLetter(ch)||isDigit(ch))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
for (n=0; n<6; n++)
{
if( strcmp(token, rwtab[n])==0) /*判断是否是关键字*/
{
syn=n+1;
break ;
}
else syn=10;
}
}
else if( isDigit(ch) ) {
{
while (isDigit(ch))
{
inte=inte*10+ch-'0'; /*将字符串转化为常数*/
ch=prog[p++];
}
p--;
ch=prog[p++];
if(ch=='.')
{
{
ch1=ch;
sum=inte;
ch=prog[p++];
if(!isDigit(ch))
{
error();
return;
}
while(isDigit(ch))
{
i++;
s=s*10+ch-'0';
ch=prog[p++];
}
p--;
sum=sum+s/pow(10,i);
syn=11;
ch=prog[p++];
}
if(ch=='e'||ch=='E') /*科学计数法 */
{
s=sum; /*保存e前面的数*/
sum=0;
ch=prog[p++]; /*读e后面的字符 */
if(!isDigit(ch)&&ch!='-')
{
error();
return;
}
if(ch=='-')
{
i=-12;
ch=prog[p++];
if(!isDigit(ch))
{
error();
return;
}
}
while (isDigit(ch)) /*读入e后面的数字字符并转化为常数*/
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(i==-12) sum=s / pow(10,sum); /*计算科学计数法的结果 */
else sum=s * pow(10,sum);
syn=12;
}
sum=sum*sign;
}
}
if(ch=='e'||ch=='E'){ /*科学计数法 */
{ sum=inte;
s=sum; /*保存e前面的数*/
sum=0;
ch=prog[p++]; /*读e后面的字符 */
if(!isDigit(ch)&&ch!='-')
{
error();
return;
}
if(ch=='-')
{
i=-1;
ch=prog[p++];
if(!isDigit(ch))
{
error();
return;
}
}
while (isDigit(ch)) /*读入e后面的数字字符并转化为常数*/
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
if(i==-1) sum=s / pow(10,sum); /*计算科学计数法的结果 */
else sum=s * pow(10,sum);
syn=12;
}
sum=sum*sign;
}
else
{
p--;
inte=inte*sign;
syn=29;
if(ch1=='.')syn=11;
}
}
else
switch(ch)
{
case '*': syn=15; token[0]=ch; break; /**15*/
case '/': syn=16; token[0]=ch; break; /*/1*/
case ':':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=') /*:= 18*/
{
syn=18;
token[m++]=ch;
}
else /*:17*/
{
syn=17;
p--;
}
break;
case '<':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='>') /*<>21*/
{
syn=21;
token[m++]=ch;
}
else if (ch=='=') /*<=22*/
{
syn=22;
token[m++]=ch;
}
else { /*<20*/
syn=20;
p--;
}
break;
case '>':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=') /*>=24*/
{
syn=24;
token[m++]=ch;
}
else /*>23*/
{
syn=23;
p--;
}
break;
case '=': syn=25; token[0]=ch; break; /*=25*/
case ';': syn=26; token[0]=ch; break; /*;26*/
case '(': syn=27; token[0]=ch; break; /*(27*/
case ')': syn=28; token[0]=ch; break; /*)28*/
case '#': syn=0; token[0]=ch; break; /*#0*/
default: syn= -1; /*error*/
}
}
void main( )
{ p=0;
printf("\r\n please input the source program:\r\n");
do { ch=getchar();
prog[p++]=ch;
} while (ch!='#');
p=0; k=1;
scaner();
if (syn==10||syn==11||syn==12||syn==29||syn==27) e();
else k=0;
if ((ch=='#') && (k==1))
printf("\r\nsuccess\r\n");
else printf("\r\nerror\r\n");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -