📄 old.cpp
字号:
#include "stdio.h"
#include "string.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", "#"}
};
char sourcefile[20] = "source.pas" ;
char lexicalfile[20] = "lexical.dc" ;
void proprocess(char filename[],char buf[])//预处理
{
FILE *fp;
int i = 0;
char oldchar='\0', curchar;
bool incomment = false;
fp = fopen(filename,"rb");
while(!feof(fp)&&fread(&curchar,sizeof(char),1,fp)==1){
switch(incomment){
case false ://注释外
if(oldchar=='/'&&curchar=='*'){//进入注释
i--;
incomment=true;
}
else {
if(oldchar=='\\'&&curchar=='\n')i--; //续行
else{
if(curchar=='\t'||curchar=='\n'||curchar==13)curchar=' ';
if(curchar!=' '||(curchar==' '&&oldchar!=' '))buf[i++]=curchar;
}
}
break;
case true:
if(oldchar=='*' && curchar=='/')incomment=false;//离开注释
break;
}
oldchar=curchar;
}
buf[i]='#';
}
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()
{
printf("错误!\n");
}
VAL_WORD lexical(char buf[])
{
VAL_WORD v={"\0","\0"};
static int i=0;
char word[WORDLEN] = {'\0'};
while(buf[i]==' ')i++;
//标识符
if((buf[i]>='A'&&buf[i]<'Z')){
while((buf[i]>='A'&&buf[i]<'Z')||(buf[i]>='0'&&buf[i]<'9'))
concat(word,buf[i++]);
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++]);
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++;}
else if(buf[i+1]=='='){strcpy(v.word,"<=");i++;}
else strcpy(v.word,"<");
break;
case '>':if(buf[i+1]=='='){strcpy(v.word,">=");i++;}
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++;}
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();
break;
}
i++;
strcpy(v.val,getval(v.word));
return v;
}
void main()
{
FILE *fp;
VAL_WORD v={0," "};
char buf[BUFLEN]={'\0'};
printf(">>>>> 分析正在进行中....\n\n");
proprocess(sourcefile,buf);
printf("%s\n\n",buf);
fp = fopen(lexicalfile,"wb");
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 + -