#include "define.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
FILE *fp;
/*//////////////////////////////////////////////////////////////////////////////
This is a pretreatment.
/////////////////////////////////////////////////////////////////////////////*/
void readIntoBuffer(char buffer[256])
{
char ch1;
char temp;
int i;
for(i=0;i<256&&!feof(fp);i++)
{
ch1=fgetc(fp);
if(ch1==' ')
{
temp=ch1;
while(ch1==' ')
ch1=fgetc(fp);
if(ch1!=EOF)
{
if(ch1!='\n'&&ch1!=' '&&ch1!='\t')
fseek(fp,-1L,1);
if(buffer[i-1]!=' ')
buffer[i]=temp;
else i=i-1;
}
else
buffer[i]=ch1;
continue;
}
if(ch1=='\n')
{
temp=ch1;
while(ch1=='\n')
ch1=fgetc(fp);
if(ch1!=EOF)
{
if(ch1!='\n'&&ch1!=' '&&ch1!='\t')
fseek(fp,-1L,1);
if(buffer[i-1]!=' ')
buffer[i]=' ';
else i=i-1;
}
else
buffer[i]=ch1;
continue;
}
if(ch1=='\t')
{
while(ch1=='\t')
ch1=fgetc(fp);
if(ch1!=EOF)
{
if(ch1!='\n'&&ch1!=' '&&ch1!='\t')
fseek(fp,-1L,1);
if(buffer[i-1]!=' ')
buffer[i]=' ';
else i=i-1;
}
else buffer[i]=ch1;
continue;
}
if(ch1=='{')
{
ch1=fgetc(fp);
while(ch1!='}')
ch1=fgetc(fp);
fseek(fp,-1L,1);
}
else
{
buffer[i]=ch1;
continue;
}
}
}
int insertid(char id[])
{
int i;
pid1=(struct Identifier*)malloc(LENID);
if(idhead==NULL)
{
for(i=0;i<20;i++)
pid1->str1[i]=id[i];
pid1->next1=idhead;
idhead=pid1;
pid2=pid1;
}
else
{
for(i=0;i<20;i++)
pid1->str1[i]=id[i];
pid1->next1=pid2->next1;
pid2->next1=pid1;
pid2=pid1;
}
return count1++;
}
int insertint(char id[])
{
int i;
pint1=(struct Integer*)malloc(LENINT);
if(inthead==NULL)
{
for(i=0;i<16;i++)
pint1->str2[i]=id[i];
pint1->next2=inthead;
inthead=pint1;
pint2=pint1;
}
else
{
for(i=0;i<16;i++)
pint1->str2[i]=id[i];
pint1->next2=pint2->next2;
pint2->next2=pint1;
pint2=pint1;
}
return count2++;
}
int insertreal(char real[])
{
int i;
preal1=(struct Real*)malloc(LENREAL);
if(realhead==NULL)
{
for(i=0;i<32;i++)
preal1->str3[i]=real[i];
preal1->next3=realhead;
realhead=preal1;
preal2=preal1;
}
else
{
for(i=0;i<32;i++)
preal1->str3[i]=real[i];
preal1->next3=preal2->next3;
preal2->next3=preal1;
preal2=preal1;
}
return count3++;
}
void getChar()
{
if(isb1empty)
{
readIntoBuffer(buffer1);
isb1empty=FALSE;
}
if(isb2empty)
{
readIntoBuffer(buffer2);
isb2empty=FALSE;
}
if(buffer1[k1]==EOF)
{
EndFlag=0;
ch=EOF;
}
if(buffer2[k2]==EOF)
{
EndFlag=0;
ch=EOF;
}
if(flag==0&&buffer1[k1]!=EOF)
{
ch=buffer1[k1];
k1++;
if(k1==256)
{
flag=1;
isb1empty=TRUE;
k1=0;
}
}
if(flag==1&&buffer2[k2]!=EOF)
{
ch=buffer2[k2];
k2++;
if(k2==256)
{
flag=0;
isb2empty=TRUE;
k2=0;
}
}
}
void retract()
{
if(flag==0)
k1=k1-1;
if(flag==1)
k2=k2-1;
}
void insert(char ch)
{
strToken[j]=ch;
j++;
}
int reserve()
{
int k;
for(k=0;k<8;k++)
{
if(strcmp(strToken,p[k])==0)
return k+1;
}
return 0;
}
/*////////////////////////////////////////////////////////////////////////////////
词法分析器,从缓冲区中取出字符,识别出单词符号
///////////////////////////////////////////////////////////////////////////////*/
void lex()
{
int code;
getChar();
if(isalpha((int)ch)||(int)ch==UNDERLINE)
{
while(isalpha((int)ch)||isdigit((int)ch)||(int)ch==UNDERLINE)
{
insert(ch);
getChar();
}
retract();
code=reserve();
if(code==0)
{
printf("(6,%d)\n",insertid(strToken));
return;
}
else
{
printf("(%s,%d)\n",strToken,code);
return;
}
}
if(isdigit((int)ch))
{
while(isdigit((int)ch))
{
insert(ch);
getChar();
}
if((int)ch==DOT)
{
getChar();
if(isdigit((int)ch))
{
while(isdigit((int)ch))
{
insert(ch);
getChar();
}
if((int)ch==EXP||(int)ch==exp)
{
getChar();
if((int)ch==MINUS)
{
insert(ch);
getChar();
}
if(isdigit((int)ch))
{
while(isdigit((int)ch))
{
insert(ch);
getChar();
}
retract();
printf("exponential\n");
return;
}
else
{
retract();
retract();
retract();
return;
}
}
else
{
retract();
printf("(7,%d)\n",insertreal(strToken));
return;
}
}
else
{
retract();
printf("(2,)\n");
return;
}
}
if((int)ch==EXP||(int)ch==exp)
{
getChar();
if((int)ch==MINUS)
{
insert(ch);
getChar();
}
if(isdigit((int)ch))
{
while(isdigit((int)ch))
{
insert(ch);
getChar();
}
retract();
printf("exponential\n");
return;
}
else
{
retract();
retract();
retract();
return;
}
}
else if(isalpha((int)ch)||ch=='$'||ch=='#')
{
insert(ch);
getChar();
while(isalpha((int)ch)||ch=='$'||ch=='#'||isdigit((int)ch))
{
insert(ch);
getChar();
}
retract();
printf("idetifier %s error\n",strToken);return;
}
else
{
printf("(8,%d)\n",insertint(strToken));return;
}
}
if((int)ch==PLUS)
{
printf("(3,10h)\n");
return;
}
if((int)ch==MINUS)
{
printf("(3,11h)\n");
return;
}
if((int)ch==MULTIPLY)
{
printf("(3,20h)\n");
return;
}
if((int)ch==DEVIDE)
{
printf("(3,21h)\n");
return;
}
if((int)ch==LBRACKET)
{
printf("(2,4)\n");
return;
}
if((int)ch==RBRACKET)
{
printf("(2,5)\n");
return;
}
if((int)ch==SEMICOLON)
{
printf("(2,2)\n");
return;
}
if((int)ch==COLON)
{
getChar();
if((int)ch==EQUAL)
{
printf("(2,3)\n");
return;
}
else{printf("冒号\n");retract();return;}
}
if((int)ch==LESS)
{
getChar();
if((int)ch==EQUAL)
{
printf("(4,01H)\n");
return;
}
if((int)ch==MORE)
{
printf("(4,05H)\n");
return;
}
else
{
retract();
printf("(3,21h)\n");
return;
}
}
if((int)ch==MORE)
{
getChar();
if((int)ch==EQUAL)
{
printf("(4,04H)\n");
return;
}
else
{
retract();
printf("(3,03h)\n");
return;
}
}
if((int)ch==EQUAL)
{
printf("(4,02H)\n");
return;
}
if((int)ch==COMMA)
{
printf("(2,0)\n");
return;
}
}
void del()
{
while(idhead!=NULL)
{
pid2=idhead->next1;
free(idhead);
idhead=pid2;
}
while(inthead!=NULL)
{
pint2=inthead->next2;
free(inthead);
inthead=pint2;
}
while(realhead!=NULL)
{
preal2=realhead->next3;
free(realhead);
realhead=preal2;
}
}
int main()
{
char fName[20];
int i;
printf("Please intput the file name that you want to compile: ");
scanf("%s",fName);
if((fp=fopen(fName,"r"))==NULL)
{
printf("cannot find thie file!");
}
while(EndFlag)
{
for(i=0;i<40;i++)
strToken[i]='\0';
j=0;
lex();
}
fclose(fp);
printf("\nOutput the keywords!\n");
while(idhead!=NULL)
{
printf("<id,%s>\n",idhead->str1);
idhead=idhead->next1;
}
printf("\nOutput the integer!\n");
while(inthead!=NULL)
{
printf("<int,%s>\n",inthead->str2);
inthead=inthead->next2;
}
printf("\nOutput the real!\n");
while(realhead!=NULL)
{
printf("<real,%s>\n",realhead->str3);
realhead=realhead->next3;
}
del();
return 0;
}