📄 lexical analysis.cpp
字号:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define VALWORDNUM 35 //单词数
#define WORDLEN 20 //单词最大长度
#define BUFLEN 1024 //缓冲区长度
typedef struct {
char val[5]; //种别
char word[15]; //单词
}VAL_WORD;
//单词种别表
VAL_WORD val_word[VALWORDNUM] =
{
{"1", "PROGRAM"},{"2", "CONST"},{"3", "VAR"},{"4","INTEGER"},{"5", "LONG"},
{"6","PROCEDURE"},{"7", "IF"},{"8", "THEN"},{"9", "WHILE"},{"10", "DO"},
{"11", "READ"},{"12","WRITE"},{"13", "BEGIN"},{"14", "END"},{"15", "ODD"},
{"16", "+"},{"17", "-"},{"18", "*"},{"19", "/"},{"20", "="},
{"21", "<>"},{"22", "<"},{"23", "<="},{"24", ">"},{"25", ">="},
{"26", "."},{"27", ","},{"28", ";"},{"29", ":"},{"30", ":="},
{"31", "("},{"32", ")"},{"33","无符号整数"},{"34","标识符"},{"35", "#"}
};
void proprocess(char filename[],char buf[])//预处理
{
FILE *fp;
int i = 0;
char curchar;
fp = fopen(filename,"rb");
while(!feof(fp)&&fread(&curchar,sizeof(char),1,fp)==1)
buf[i++]=curchar;
buf[i]='#';
fclose(fp);
}
void concat(char word[],char c)//拼接单词
{
for(int i=0;word[i]!='\0';i++);
word[i++]=c;
word[i]='\0';
}
char* getval(char word[])//获取单词种别
{
for(int i=0;i<VALWORDNUM;i++)
if(strcmp(val_word[i].word,word)==0)return val_word[i].val;
return "0";
}
void error(int line,int row)
{
printf(">>>>> 分析有错误!\n\n");
printf(">>>>> ERROR IN %3d LINE %3d ROW\n",line,row);
exit(0);
}
VAL_WORD lexical(char buf[])
{
VAL_WORD v={"\0","\0"};
static int i=0,row=0,line=1;
char word[WORDLEN] = {'\0'};
while(buf[i]==' '||buf[i]=='\n'||buf[i]=='\f'||buf[i]==13||buf[i]==10)//删除空格类字符,包括回车、制表符空格
{
i++;
row++;
if(buf[i]==10){line++;row=0;}
}
//标识符
if((buf[i]>='A'&&buf[i]<'Z')){
while((buf[i]>='A'&&buf[i]<'Z')||(buf[i]>='0'&&buf[i]<'9'))
{
concat(word,buf[i++]);
row++;
}
strcpy(v.val,getval(word));
if(strcmp(v.val,"0")==0)strcpy(v.val,"34");
strcpy(v.word,word);
return v;
}
//无符号整数
if(buf[i]>='0'&&buf[i]<'9'){
while(buf[i]>='0'&&buf[i]<'9'){
concat(word,buf[i++]);
row++;
}
strcpy(v.val,getval(word));
if(strcmp(v.val,"0")==0)strcpy(v.val,"33");
strcpy(v.word,word);
return v;
}
//其他
switch(buf[i]){
case '+':strcpy(v.word,"+");break;
case '-':strcpy(v.word,"-");break;
case '*':strcpy(v.word,"*");break;
case '/':strcpy(v.word,"/");break;
case '=':strcpy(v.word,"=");break;
case '<':if(buf[i+1]=='>'){strcpy(v.word,"<>");i++;row++;}
else if(buf[i+1]=='='){strcpy(v.word,"<=");i++;row++;}
else strcpy(v.word,"<");
break;
case '>':if(buf[i+1]=='='){strcpy(v.word,">=");i++;row++;}
strcpy(v.word,">");
break;
case '.':strcpy(v.word,".");break;
case ',':strcpy(v.word,",");break;
case ';':strcpy(v.word,";");break;
case ':':if(buf[i+1]=='='){strcpy(v.word,":=");i++;row++;}
strcpy(v.word,":");
break;
case '(':strcpy(v.word,"(");break;
case ')':strcpy(v.word,")");break;
case '#':strcpy(v.word,"#");break;
default:strcpy(v.val,"0");
error(line,row);
break;
}
i++;
row++;
strcpy(v.val,getval(v.word));
return v;
}
void main()
{
FILE *fp;
VAL_WORD v={0," "};
char sourcefile[20] = "source.pas" ;
char lexicalfile[20] = "lexical.dc" ;
char buf[BUFLEN]={'\0'};
printf(">>>>> 分析正在进行中....\n\n");
proprocess(sourcefile,buf);
printf("源程序:\n%s\n\n",buf);
fp = fopen(lexicalfile,"wb");
printf("二元式为:\n%5s%15s\n","种别","单词");
while(strcmp(v.word,"#")!=0){
v=lexical(buf);
printf("%5s%15s\n",v.val,v.word);
fwrite(&v.val,sizeof(int),1,fp);
fwrite(&v.word,15*sizeof(char),1,fp);
}
fclose(fp);
printf("\n\n>>>>> 分析成功结束!\n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -