资源简介
输入:源程序
输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列。
代码片段和文件信息
// 词法分析器.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语言实现
评论
共有 条评论