📄 词法分析器.h
字号:
//#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
#include "ctype.h"
#include "string.h"
typedef struct
{
int num;
char word[20];
}key;
int line=1,column=0,c;
char str[20];
key keyword[15]=
{
{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"}
};
/*void output(int m,char * s)
{
cout<<"["<<m<<","<<s<<"]"<<' '<<line<<' '<<column-strlen(s)+1<<endl;
}*/
char getch(FILE * fp)
{
char ch;
ch=fgetc(fp);
if(ch=='\n')
{
line=line+1;
column=0;
}
else
{
column=column+1;
c=column;
}
return ch;
}
void seek(FILE *fp,char ch)
{
if(ch=='\n')
{
line=line-1;
column=c;
}
else
{
column=column-1;
c=column;
}
fseek(fp,-1,1);
}
int compare(char *s1)
{
int i;
for(i=0;i<20;i++)
{
if(strcmp(s1,keyword[i].word)==0)
return keyword[i].num;
}
return -1;
}
int getsym(FILE * fp)
{
char ch;
int n,m;
int val;
ch=getch(fp);
while(ch==' ')ch=getch(fp);
if(isalpha(ch))
{
n=0;
while(isalnum(ch))
{
if(n<20)
{
str[n]=ch;
n=n+1;
}
ch=getch(fp);
}
seek(fp,ch);
str[n]='\0';
m=compare(str);
if(m!=-1)
{
//output(m,keyword[m-1].word);
return m;
}
else
{
//output(34,str);
return 34;
}
}
/*else if(isdigit(ch))
{
val=0;
int i=0;
while(isdigit(ch))
{
val=val*10+ch-'0';
ch=getch(fp);
i=i+1;
}
seek(fp,ch);
cout<<'['<<33<<','<<val<<']'<<line<<' '<<column-i+1<<endl;
return 33;
}*/
else if(isdigit(ch))
{
str[0]=ch;
ch=getch(fp);
n=1;
while(isdigit(ch))
{
str[n]=ch;
n++;
ch=getch(fp);
}
str[n]='\0';
seek(fp,ch);
//output(33,str);
return 33;
}
else
switch(ch)
{
case '+'://output(16,"+");
str[0]='+';
str[1]='\0';
return 16;break;
case '-'://output(17,"-");
str[0]='-';
str[1]='\0';
return 17;break;
case '*'://output(18,"*");
str[0]='*';
str[1]='\0';
return 18;break;
case '/'://output(19,"/");
str[0]='/';
str[1]='\0';
return 19;break;
case '='://output(20,"=");
str[0]='=';
str[1]='\0';
return 20;break;
case ','://output(26,",");
str[0]=',';
str[1]='\0';
return 26;break;
case '.'://output(27,".");
str[0]='.';
str[1]='\0';
return 27;break;
case ';'://output(28,";");
str[0]=';';
str[1]='\0';
return 28;break;
case '('://output(31,"(");
str[0]='(';
str[1]='\0';
return 31;break;
case ')'://output(32,")");
str[0]=')';
str[1]='\0';
return 32;break;
case '#'://output(35,"#");
str[0]='#';
str[1]='\0';
return 35;break;
case '<':
str[0]=ch;
ch=getch(fp);
if(ch=='>')
{
str[1]=ch;
str[2]='\0';
//output(21,str);
return 21;
}
else
{
if(ch=='=')
{
str[1]=ch;
str[2]='\0';
//output(23,str);
return 23;
}
else
{
str[1]='\0';
seek(fp,ch);
//output(22,str);
return 22;
}
}
break;
case '>':
str[0]=ch;
ch=getch(fp);
if(ch=='=')
{
str[1]=ch;
str[2]='\0';
//output(25,str);
return 25;
}
else
{
str[1]='\0';
seek(fp,ch);
//output(24,str);
return 24;
}
break;
case ':':
str[0]=ch;
ch=getch(fp);
if(ch=='=')
{
str[1]=ch;
str[2]='\0';
//output(30,str);
return 30;
}
else
{
str[1]='\0';
seek(fp,ch);
//output(29,str);
return 29;
}
break;
default:
{
if(ch!=EOF&&ch!=' '&&ch!='\n')
{
cout<<"ERROR: "<<ch<<" line: "<<line<<" column: "<<column<<endl;
return -1;
}
else
return 0;
}
}
}
/*int main()
{
FILE *fp;
char wenjian[30];
cout<<"Please input the file you want to transform:";
cin>>wenjian;
fp=fopen(wenjian,"r");
while(!feof(fp))
{
getsym(fp);
}
return 0;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -