📄 词法分析器.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<string.h>
int y=0,z=0,j=0;
int i=0,m=1000,n=2000;
char character,s;
int c;
char token[30];
void show(char *a,int d)
{
token[j]='\0';
cout<<"("<<a<<","<<d<<")"<<endl;
ofstream fout("result.txt",ios::ate);
fout<<"("<<a<<","<<d<<")"<<endl;
fout.close();
token[0]='\0';j=0;
}
void show(char *a,char *b)
{
token[j]='\0';
cout<<"("<<a<<","<<b<<")"<<endl;
ofstream fout("result.txt",ios::ate);
fout<<"("<<a<<","<<b<<")"<<endl;
fout.close();
token[0]='\0';j=0;
}
int reserve()//按token中的字符串查找保留字表,若是保留字,返回它的编码,否则返回0
{
if (!(strcmp(token,"double")))
return 1;
else if (!(strcmp(token,"int")))
return 2;
else if (!(strcmp(token,"struct")))
return 3;
else if (!(strcmp(token,"break")))
return 4;
else if (!(strcmp(token,"else")))
return 5;
else if (!(strcmp(token,"long")))
return 6;
else if (!(strcmp(token,"switch")))
return 7;
else if (!(strcmp(token,"case")))
return 8;
else if (!(strcmp(token,"enum")))
return 9;
else if (!(strcmp(token,"register")))
return 10;
else if (!(strcmp(token,"typedef")))
return 11;
else if (!(strcmp(token,"char")))
return 12;
else if (!(strcmp(token,"extern")))
return 13;
else if (!(strcmp(token,"return")))
return 14;
else if (!(strcmp(token,"union")))
return 15;
else if (!(strcmp(token,"const")))
return 16;
else if (!(strcmp(token,"float")))
return 17;
else if (!(strcmp(token,"short")))
return 18;
else if (!(strcmp(token,"unsigned")))
return 19;
else if (!(strcmp(token,"continue")))
return 20;
else if (!(strcmp(token,"for")))
return 21;
else if (!(strcmp(token,"signed")))
return 22;
else if (!(strcmp(token,"void")))
return 23;
else if (!(strcmp(token,"default")))
return 24;
else if (!(strcmp(token,"goto")))
return 25;
else if (!(strcmp(token,"sizeof")))
return 26;
else if (!(strcmp(token,"volatile")))
return 27;
else if (!(strcmp(token,"do")))
return 28;
else if (!(strcmp(token,"if")))
return 29;
else if (!(strcmp(token,"static")))
return 30;
else if (!(strcmp(token,"while")))
return 31;
else if (!(strcmp(token,"main")))
return 32;
else return 0;
}
void getchar()//将下一个输入字符读入character的过程,将向前指针移向下一个字符
{
i=i+1;
}
void getbe()//若character中的字符为空白,则调用getchar,直到character为非空白为止。开始指针移到向前指针位置
{
while(character==' ') getchar();
}
void concatenation(char s)//将token中的字符串与character中的字符连接,作为token中的新的字符串
{
token[j]=s;
j++;
token[j]='\0';
}
int letter(char s)
{
switch(s)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
return 1;
default:return 0;
}
}
int digit(char s)
{
switch(s){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return 1;
default:return 0;
}
}
void main()
{
ifstream in("test.txt");
char str[80];
in.read(str,100);
cout<<"the original words are: "<<str;
while(str[i]!='\0'){
character=str[i];
while(character==' ') {i=i+1;character=str[i];}
s=str[i];
switch(s)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
while(letter(s)||digit(s))
{
concatenation(s);
i++;
s=str[i];
}
c=reserve();
if(c==0) //不是保留字
{
show(token,m);m++; //m为标识符的地址参数
break;
}
else //是保留字
{
show(token,reserve());
break;
}
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
while(digit(s))
{
concatenation(s);
i++;
s=str[i];
}
show(token,n);n++; //n为常数的地址参数
break;
case '+':getchar();show("+"," ");break;
case '-':getchar();show("-"," ");break;
case '*':
getchar();character=str[i];
if(character=='*') {show("**"," ");i++;}
else show("*"," ");
break;
case'<':
getchar();character=str[i];
if(character=='=')
{
show("<="," ");i++;
}
else if(character=='>')
{
show("<>"," ");i++;
}
else show("<"," ");
break;
case'=':
getchar();character=str[i];
if(character=='=')
{
show("=="," ");i++;
}
else show("="," ");
break;
case '>':
getchar();character=str[i];
if(character=='=') {show(">="," ");i++;}
else show(">"," ");
break;
case ':':
getchar();character=str[i];
if(character=='=') {show(":="," ");i++;}
else show(":"," ");
break;
case ';':
show(";"," ");i++;break;
case '{':
show("{"," ");i++;break;
case '}':
show("}"," ");i++;break;
case '(':
show("("," ");i++;break;
case ')':
show(")"," ");i++;break;
case '/':
show("/"," ");i++;break;
default:i++;break;
}//end switch
}//end while
}//end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -