#include<iostream>
#include<string>
using namespace std;
#define MAX 256
string key,name;
void error(){
cout<<"变量名出错!!!"<<endl;
}
void error1(){
cout<<"表达式最后缺少分号!!!"<<endl;
}
void error2(){
cout<<"缺少关键词!!!"<<endl;
}
void error3(){
cout<<"变量名有空格!!!"<<endl;
}
void error4(){
cout<<"分号后面没有变量!!!"<<endl;
}
void error5(){
cout<<"变量名重复!!!"<<endl;
}
//**********忽略前后空格函数**********************
string str_erase(string s){
int begin=0,end=s.length()-1;
//*******使用循环删除字符串中前后空格*********
/*if(s[begin]==' ')
{
for(;begin<end,s[begin]==' ';begin++)
{
if(s[begin+1]!=' ')
s.erase(0,begin+1);
}
}
cout<<s<<endl;
if(s[end]==' ')
{
for(;end>begin,s[end]==' ';end--)
{
if(s[end-1]!=' ')
s.erase(s.length()-end+1,end-1);
}
}
cout<<s<<endl;*/
//*******使用递归删除字符串中前后空格*********
if(s[begin]==' ')
{
s.erase(0,1);
s=str_erase(s);
}
if(s[end]==' ')
{
s.erase(end,1);
s=str_erase(s);
}
return s;
}
//*******************提取单词************************
void lex(string s){
int i,flag=-1;
for(i=0;i<s.length();i++)
{
if(s[i]!=' '&&flag==-1)
{
flag=i;
}
if(s[i]==' '&&s[i-1]!=' '&&i!=0)
{
key=s.substr(flag,i-flag);
name=s.substr(i);
name=str_erase(name);
cout<<"************************************"<<endl;
cout<<"关 键 字 部 分:"<<key<<endl;
cout<<"变量表达式部分:"<<name<<endl;
break;
}
}
}
//************检查结束符号是否为分号*****************
int match_last(string s){
s=str_erase(s);
if(s[s.length()-1]==';')
return 1;
else
{
error1();
return 0;
}
}
//****************关键词匹配判断*********************
int match_key(){
if(key=="integer"||key=="real")
return 1;
else
{
error2();
return 0;
}
}
//************参数名称匹配判断***********************
int match_name(){
string n[10]={""};
int i,j=0,cnt=0,pos=0;
for(i=0;i<name.length();i++)
{
if(name[i]==',')
{
n[cnt]=name.substr(pos,i-pos);
pos=i+1;
n[cnt+1]=",";
//cout<<n[0]<<"@@@"<<endl;
//cout<<pos<<" "<<name.length()-1-pos<<endl;
cnt=cnt+2;
if(cnt>11) cout<<"变量太多"<<endl;
}
}
if(pos==name.length()-1)
{
error4();
return 0;
}
n[cnt]=name.substr(pos,name.length()-1-pos);
n[cnt+1]=";";
cout<<"************************************"<<endl;
cout<<"parameters:"<<endl;
for(i=0;i<cnt+1;i=i+2){
n[i]=str_erase(n[i]);
cout<<"("<<i/2+1<<")"<<n[i]<<endl;
}
for(i=0;i<cnt+1;i=i+2){
for(j=i+2;j<cnt+1;j+=2){
if(n[i]==n[j]){
error5();
return 0;
}
}
}
cout<<"************************************"<<endl;
cout<<"符号表:"<<endl;
cout<<"(1)"<<key<<endl;
for(i=0;i<cnt+2;i++){
cout<<"("<<i+2<<")"<<n[i]<<endl;
}
//cout<<"i="<<i<<" j="<<j<<endl;
for(i=0;i<cnt+1;i=i+2)
{
for(j=0;j<n[i].length();j++)
{
//cout<<n[i][j]<<endl;
//cout<<n[i].length()<<endl;
//cout<<n[i]<<endl;
if(j==0)
{
if((n[i][j]>='a'&&n[i][j]<='z')||(n[i][j]>='A'&&n[i][j]<='Z')||n[i][j]=='_')
{
//cout<<" ###1"<<endl;
;
}
else
{
//cout<<"@@@1";
error();
return 0;
}
}
else
{
if((n[i][j]>='a'&&n[i][j]<='z')||(n[i][j]>='A'&&n[i][j]<='Z')||n[i][j]=='_'||(n[i][j]>='0'&&n[i][j]<='9'))
{
//cout<<" ###2"<<endl;
;
}
else
{
//cout<<"@@@2";
error();
return 0;
}
}
//cout<<"************"<<endl;
}
}
return 1;
}
//*************分析是否成功**************************
int analysis(string s){
//cout<<match_last(s)<<match_key()<<match_name()<<endl; //debug
if(match_last(s)&&match_key()&&match_name())
return 1;
else
return 0;
}
//********************主函数*************************
int main(){
cout<<"************************************"<<endl;
cout<<"*************编译器说明*************"<<endl;
cout<<"1.完成了对简单编译器的翻译。 "<<endl;
cout<<"2.参照下列文法,单词提取 "<<endl;
cout<<"3.依据题目要求,关键字只有integer和 "<<endl;
cout<<" real两个关键字。 "<<endl;
cout<<"4.本人依据c语言的变量命名方法,限制 "<<endl;
cout<<" 了变量名只允许字母数字和下划线,且"<<endl;
cout<<" 第一个字符不能为数字。 "<<endl;
cout<<"5.关于程序中可能会出现的空格,本人已"<<endl;
cout<<" 经依据c语言风格处理掉。 "<<endl;
cout<<"6.另外针对重复变量名添加了报错功能。"<<endl;
cout<<"************************************"<<endl;
cout<<"*****作者:***软件0703班****毕忱*****"<<endl;
cout<<"************************************"<<endl;
cout<<"请输入简单说明语句,形如(real a,b;):"<<endl;
cout<<"文法如下:"<<endl;
cout<<"D-->integer<namelist>|real<namelist>"<<endl;
cout<<"<namelist>--><namelist>,id|id>"<<endl;
char c[MAX];
gets(c);
string s = c;
lex(s);
int success=analysis(s);
if(1==success)
cout<<"SUCCESS"<<endl;
else
cout<<"FAILD"<<endl;
//s=str_erase(s);
//cout<<s<<"haha"<<endl;
return 0;
}
bianyi.rar_编译原理课设
版权申诉
43 浏览量
2022-09-23
10:08:16
上传
评论
收藏 875KB RAR 举报
邓凌佳
- 粉丝: 65
- 资源: 1万+