資源簡介
輸入:源程序
輸出:二元組(詞法記號,屬性值/其在符號表中的位置)構成的序列。
代碼片段和文件信息
//?詞法分析器.cpp?:?定義控制臺應用程序的入口點。
//
#include?“stdafx.h“
#include
#include
#include
#include?
#include
#include?
#include?
#include?
#include?
#include
#define?MAX?20
typedef?struct?
{
int?syn;???
char?value[MAX];?
int?line;
}WS;
int?linenum=1;
char?ch;
FILE?*fp;
void?getbc()?
{
while(ch==‘?‘)
ch=fgetc(fp);
}
int?letter()?
{????
if((ch>=‘A‘)&&(ch<=‘Z‘)||(ch>=‘a‘)&&(ch<=‘z‘))?
return?1;
else?
return?0;
}
int?linee()
{
if(ch==‘\n‘)
return?1;
else?
return?0;
}
int?digit()?
{
if((ch>=‘0‘)&&(ch<=‘9‘))?
return?1;
else?
return?0;
}
int?reserve(char?*token)???
{
int?key=10i;
char?WORDS_KEY[8][20]={“main““do““then““if““else““for““while““void“};
for(i=0;i<8;i++)?????
if(strcmp(tokenWORDS_KEY[i])==0)
{
key=i+1;?
break;
}?
return?key;
}
void?error(WS?*wd)?
{
printf(“There?has?some?wrong?words?or?mistakes\n“);
}
void?print(WS?*wd)?
{
if(wd->syn!=-2)
{
printf(“<%d%s>\n“wd->synwd->value);
}
else
{
printf(“?Line?%d\n“wd->line);
// printf(“\n“);
}
}
WS?scaner()?
{
char?token[20];
WS?wd;
int?c;
int?i=0;????
ch=fgetc(fp);
getbc();
if(linee())
{ wd.line=linenum++;
wd.syn=-2;
// linenum++;
// if()
return?wd;
}
???else
???if(letter())
???{
???reserve((char?*)token);
while(letter()||digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
token[i]=‘\0‘;
fseek(fp-1L1);?
c=reserve(token);
if(c!=10)?
{
wd.syn=c;
strcpy(wd.valuetoken);?
return?wd;
}
else??????
{?
wd.syn=10;
strcpy(wd.valuetoken);
return?wd;
}
}
else?if(digit())?
{
while(digit())
{?????????
token[i]=ch;
ch=fgetc(fp);
i++;
}
if(letter())
{
wd.syn=-1;
while(ch!=‘;‘)
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
return?wd;
}
else
{
fseek(fp-1L1);????
token[i]=‘\0‘;
wd.syn=11;
strcpy(wd.valuetoken);
return?wd;
}
}
else?
{
switch(ch)?
{ ?
case?‘+‘:?
ch=fgetc(fp); ??????
if(ch==‘+‘)?
{
wd.syn=13;
wd.value[0]=‘+‘;
wd.value[1]=‘+‘;??
wd.value[2]=‘\0‘;??
return?wd;?
break;
} ???????
fseek(fp-1L1); ??????????
wd.syn=25;
wd.value[0]=‘+‘;?
wd.value[1]=‘\0‘;?
return?wd;?
break;?????????
case?‘-‘:?
wd.syn=14;
wd.value[0]=‘-‘;?
wd.value[1]=‘\0‘;?
return?wd;?
break;
case?‘*‘:?
wd.syn=15;
wd.value[0]=‘*‘;?
wd.value[1]=‘\0‘;??
- 上一篇:航空訂票系統C語言順序表版
- 下一篇:運動會C語言實現
評論
共有 條評論