📄 词法分析.cpp
字号:
#include<string.h>
#include<iostream.h>
#include<fstream.h>
#include<assert.h>
#include<ctype.h>
#include<conio.h>
#define SIZE 100
const char kind[57][12]={" ","PROGRAM","VAR","PROCEDURE","BEGIN","END","IF","THEN",
"ELSE","WHILE","DO","TRUE","FALSE","OF","READ","READLN","WRITE",
"WRITELN","FOR","DOWNTO","TO","ARRAY","OR","DIV","MOD","AND",
"NOT","CONST",">","<=",">=","<>","<","=","EOLN","[","]","EOF",
"(",")","+","-","*","/",";",":",":=",",",".","整数常数","实型常数",
"字符串常数","标识符","REAL","INTEGER","CHAR","BOOLEAN"};
int check(const char* word_string,const char kind[57][12]);
int main(int argc, char *argv[])
{
char* file_name,*file_aim,*file_error;
char temp_name[20];
char line_string[100];
char word_string[20];
int i,j,k,line,flag;
if(argc==2)
{
file_name=argv[1];
}
else
{
cout<<"请输入源程序名:";
cin>>temp_name;
file_name=temp_name;
}
if(strstr(file_name,".pas")==NULL)
strcat(file_name,".pas");
ifstream f_source(file_name,ios::in|ios::nocreate);
assert(f_source);
file_aim=strcat(strtok(file_name,"."),".dyd");
ofstream f_aim(file_aim,ios::out);
assert(f_aim);
file_error=strcat(strtok(file_name,"."),".err");
ofstream f_error(file_error,ios::out);
assert(f_error);
line=0;
while(f_source.getline(line_string,SIZE))
{
line++;
i=0;
while((unsigned)i<strlen(line_string))
{
while(line_string[i]==' '||line_string[i]==9)
i++;
if(isalpha(line_string[i]))
{
j=0;
while(isalnum(line_string[i]))
{
word_string[j]=toupper(line_string[i]);
j++;
i++;
}
word_string[j]='\0';
k=check(word_string,kind);
if(k==0)
f_aim<<word_string<<" "<<52<<endl;
else
f_aim<<word_string<<" "<<k<<endl;
}
else if(isdigit(line_string[i]))
{
j=0;
flag=0;
while(isdigit(line_string[i]) || (line_string[i]=='.' && isdigit(line_string[i+1]) && flag!=1))
{
if(line_string[i]=='.')
flag=1;
word_string[j]=line_string[i];
j++;
i++;
}
word_string[j]='\0';
if(strstr(word_string,"."))
f_aim<<word_string<<" "<<50<<endl;
else
f_aim<<word_string<<" "<<49<<endl;
}
else if(line_string[i]=='<' || line_string[i]=='>')
{
j=0;word_string[j]=line_string[i];
if(line_string[i+1]=='=')
{
word_string[++j]=line_string[++i];
}
word_string[++j]='\0';
i++;
f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
}
else if(line_string[i]=='<' && line_string[i+1]=='>')
{
j=0;
word_string[j]=line_string[i];
word_string[++j]=line_string[++i];
word_string[++j]='\0';
i++;
f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
}
else if(line_string[i]==':' && line_string[i+1]=='=')
{
j=0;
word_string[j]=line_string[i];
word_string[++j]=line_string[++i];
word_string[++j]='\0';
i++;
f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
}
else if(line_string[i]=='=' || line_string[i]=='[' || line_string[i]==']'
|| line_string[i]=='(' || line_string[i]==')' || line_string[i]=='+'
|| line_string[i]=='-' || line_string[i]=='*' || line_string[i]=='/'
|| line_string[i]==';' || line_string[i]=='.' || line_string[i]==','
|| line_string[i]==':')
{
j=0;
word_string[j]=line_string[i];
word_string[++j]='\0';
i++;
f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
}
else if(line_string[i]=='\'')
{
i++;
j=0;
word_string[j]=line_string[i];
i++;
j++;
word_string[j]='\0';
if(line_string[i]=='\'')
{
f_aim<<word_string<<" "<<51<<endl;
i++;
}
else
{
cout<<"**LINE:"<<line<<" "<<"字符常量定义出错"<<endl;
f_error<<"***LINE:"<<line<<" "<<"字符常量定义出错"<<endl;
}
}
else if(line_string[i]=='\"')
{
i++;
j=0;
while(line_string[i]!='\"' && (unsigned)i<strlen(line_string))
{
word_string[j]=line_string[i];
i++;
j++;
}
word_string[j]='\0';
if(line_string[i]=='"')
{
f_aim<<word_string<<" "<<51<<endl;
i++;
}
else
{
cout<<"***LINE:"<<line<<" "<<"\"号不匹配"<<endl;
f_error<<"***LINE:"<<line<<" "<<"\"号不匹配"<<endl;
}
}
else
{
cout<<"***LINE:"<<line<<" "<<"含有非法字符"<<endl;
f_error<<"***LINE:"<<line<<" "<<"含有非法字符"<<endl;
i++;
}
}
f_aim<<"EOLN"<<" "<<line<<endl;
}
f_aim<<"EOF"<<" "<<line;
cout<<endl<<"词法分析完成!"<<endl;
cout<<"请查看 .err 文件!"<<endl;
f_source.close();
f_aim.close();
cout<<"请按任意键退出。"<<endl;
getch();
return 0;
}
int check(const char* word_string,const char kind[57][12])
{
int k,flag=0;
for(k=1;k<=56;k++)
{
if(strcmp(word_string,kind[k])==0)
{
flag=1;
break;
}
}
if(flag==1)
return k;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -