• 大小: 5KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-07-19
  • 语言: C/C++
  • 标签:

资源简介

输入:源程序 输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列。

资源截图

代码片段和文件信息

// 词法分析器.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‘;  

评论

共有 条评论

相关资源