编译原理 第二次实验 语法分析 按照崔老师上午授课内容写出来框架

编程入门 行业动态 更新时间:2024-10-25 12:17:13

编译原理 第二次实验  <a href=https://www.elefans.com/category/jswz/34/1770552.html style=语法分析 按照崔老师上午授课内容写出来框架"/>

编译原理 第二次实验 语法分析 按照崔老师上午授课内容写出来框架

 

老师授课内容:

 

注意:

调用advance(),依次读取一个词法分析得到的结果,得到的结果形式为 (种别码,D)   其中D 可以为  +  -  *  /   数字  。

定义:

sym 得到的是每次取得结果   (   和  ,前面中间的值,即种别码。  种别码时string类型。

 

举例: 

以下程序用来判断是+  或者  -  

 

以下程序用来判断 *  或者 /

 

以下程序用来判断  (

 

以下程序用来判断  )

 

以下程序用来判断数字(注意数字不用管数值是多少)

 

以下程序用来报错:

 printf("Error!\n");exit(1);

 

 

程序框架1如下:

如果运行不了,可以试试框架2

#include<bits/stdc++.h>
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<sstream>using namespace std;template <class Type> Type stringToNum(const string& str)
{istringstream iss(str);Type num;iss >> num;return num;
}int num=0;
int sum=0;ifstream infile("d.txt");//词法分析的结果或语法分析的输入
string str;//string变量进行字符识别
string sym; //指针
string sym1;
int temp=0;//int expressionAnalysis();//表达式分析
//int termAnaysis();//项分析
//int factorAnalysis();//因子分析
//int advance();
int E();
int E_plus();
int T();
int T_plus();
int F();int conterr=0;//记录错误
int lpnum=0;//记录左括号
int found;//提取字符串中指针的位置
string sym2;
int found1;
int flag=0;//记录往后移动一个指针SYM是否正确
string s;//用来保存要分析的字符串
struct _2tup
{string token;int id;
};int advance() //SYM的移动
{if(!getline(infile,str)) //从文件中提取字符{return 0;}
//    cout<<str<<endl;s+=str;
//    cout<<s<<endl;found=str.find(',',0);found1=str.find(')',0);
//    cout<<found1<<endl;if(found==-1) //当为error的时候,没有‘,’{conterr++;return 0;
//        cout<<"语法错误 识别字符错误"<<endl;
//        return -1;}if(temp==1)sym1=sym;sym=str.substr(1,found-1);sym2=str.substr(found+1,found1-found-1);num=stringToNum<int>(sym2);
//    cout<<num<<endl;return 1;
}int F()
{}
int T_plus()
{}
int T()
{}int E_plus()
{}int E()
{T();E_plus();}
void yufafenxi()//语法分析
{
//    freopen("CON", "w", stdout);//结果在控制台上输出
//    flag=advance();
//    if(flag)-
//    {advance();E();
//    advance();if(strcmp(str.data(),"#")!=0){printf("%s\n",s.data());printf("Error\n");}else{cout<<"OK:   "<<s<<endl;}
//    }
//    if(flag!=-1 && !conterr)
//    {
//    cout<<"正确:"<<s<<endl;
//    }}string instr;//输入符号串
int index;//当前输入符号读入字符的位置
char character;//全局变量字符,存放最新读入的字符
string token;//字符数组,存放已读入的字符序列
map<string, int> Symbol;//标识符集
map<string, int> Digit;//常数集
map<string, int> other;//other
map<string, int>::iterator ite;
const int len = 100;
string Reserve[len];//保留字表
map<string,int> type;
//void init_Reserve()  //构造保留字表的函数
//{
//    Reserve[1] = "begin";
//    Reserve[2] = "end";
//    Reserve[3] = "if";
//    Reserve[4] = "then";
//    Reserve[5] = "while";
//    Reserve[6] = "do";
//    Reserve[7] = "const";
//    Reserve[8] = "var";
//    Reserve[9] = "call";
//    Reserve[10] = "procedure";
//
//}
void getChar()  //读入一个字符
{character = instr[index++];
}
void getnbc()  //读入非空白字符
{while (character == ' '){getChar();}
}
void concat()  //连接字符串
{token = token + character;
}
bool letter()  //判断是否为字母
{if ((character >= 'A'&&character <= 'Z') || (character >= 'a'&&character <= 'z'))return true;return false;
}
bool digit()  //判断是否为数字
{if (character >= '0'&&character <= '9')return true;return false;
}
void retract() //回退字符的函数
{
//    character = ' ';index--;
}
int reserve()  //匹配保留字符
{for (int i = 0; i < len; i++)if (Reserve[i] == token)return i;return -1;
}
void symbol()
{ite = Symbol.find(token);if (ite != Symbol.end()){
//        return ite->first;return ;}else{Symbol[token] = Symbol.size();return ;
//        return token;}
}
void constant()
{ite = Digit.find(token);if (ite != Digit.end()){
//        return ite->first;return ;}else{Digit[token] = Digit.size();return ;
//        return token;}
}
void Three()
{ite = other.find(token);if (ite != other.end()){return ;
//        return ite->first;}else{other[token] = other.size();return ;
//        return token;}
}
void error()
{cout << token << "\t-->\t该单词不存在" << endl;
}
//词法分析函数,逐个识别单词
string LexAnalyze()
{token = "";getChar();getnbc();string val;
//    int num = -1;if(character>='a'&&character<='z' || character>='A'&&character<='Z'){while (letter() || digit())  //为字母或数字{concat();//追加到token末尾//            if(token=="odd")
//            {
//                getChar();
//                Three();
//                return ;
//            }getChar();//读取下一个字符}if(token=="odd"){getChar();Three();return 0;}retract();//回退一个字符{
//            val = symbol();//查看标识符表symbol();}}else if(character>='0' && character<='9'){int flag=0;while (character>='0' && character<='9' || character>='a' && character<='z' || character>='A' && character <='Z'){if(character>='0' && character<='9')concat();if(character>='a' && character<='z' || character>='A' && character <='Z'){concat();flag=1;}getChar();}if(flag==1){error();return 0;}retract();
//        val = constant();//查看常数表constant();}else if(character=='<'){concat();getChar();if (character == '='){concat();Three();
//返回<=符号}else if(character=='>'){concat();Three();}else{retract();Three();
//返回<符号}}else if(character=='>'){concat();getChar();if (character == '='){concat();Three();
//返回>=符号}else{retract();Three();
//返回>符号}}else if(character=='='){concat();getChar();if (character == '='){concat();Three();
//返回==符号}else{retract();Three();
//返回=符号}}else if(character==':'){concat();getChar();if (character == '='){concat();Three();}else{cout<<token<<endl;error();return 0;}}else if(character=='+'){concat();Three();}else if(character=='-'){concat();Three();}else if(character=='*'){concat();Three();}else if(character=='/'){concat();Three();}else if(character=='('){concat();Three();}else if(character==')'){concat();Three();}else if(character==','){concat();Three();}else if(character=='.'){concat();Three();}else if(character==';'){concat();Three();}else if(character=='#'){concat();return token;}else{error();return 0;}return token;}
void show_table()
{cout << "\n==================" << "标识符" << "==================" << endl;
//    cout << "标识符\t\t类别编码\t表中位置" << endl;for (ite=Symbol.begin(); ite != Symbol.end(); ite++){
//        int flag=0;
//        for (int i = 0; i < len; i++)
//        {cout<<Reserve[i]<<endl;
//            if (Reserve[i] == ite->first)
//            {
//                cout<<ite->first<<"是保留字"<<"   ";
//                cout << "("<<ite->first <<","<<ite->second<<")" << endl;
//                flag=1;
//                break;
//            }
//
//
//        }
//        if(flag==0)
//            cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);if(iter!=type.end())cout << "("<<iter->second <<","<<ite->second<<")" << endl;elsecout << "("<<type.size() <<","<<ite->second<<")" << endl;}cout << "\n==================" << "常数表" << "==================" << endl;
//    cout << "常量值\t\t类别编码\t表中位置" << endl;for (ite = Digit.begin(); ite != Digit.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);
//        if(iter!=type.end())
//            cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//        elsecout << "("<<type.size()-1 <<","<<ite->second<<")" << endl;}cout << "\n==================" << "算符、界符" << "==================" << endl;for (ite = other.begin(); ite != other.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//           cout<<iter->second<<endl;}
}
int main()
{
//    clock_t start,finish;
//    double totaltime;
//    start=clock();type["begin"]=type.size();type["end"]=type.size();type["if"]=type.size();type["then"]=type.size();type["while"]=type.size();type["do"]=type.size();type["const"]=type.size();type["var"]=type.size();type["call"]=type.size();type["procedure"]=type.size();type["+"]=type.size();type["-"]=type.size();type["*"]=type.size();type["/"]=type.size();type["odd"]=type.size();type["="]=type.size();type["<>"]=type.size();type["<"]=type.size();type[">"]=type.size();type["<="]=type.size();type[">="]=type.size();type[":="]=type.size();type["("]=type.size();type[")"]=type.size();type[","]=type.size();type["."]=type.size();type[";"]=type.size();type["常数"]=type.size();type["标识符"]=type.size();//    init_Reserve();//保留字表初始化Symbol.clear();//标识符集初始化Digit.clear();//常数集初始化index = 0;character = ' ';token = "";cout << "请输入待词法分析的源程序代码:输入文件结束符结束输入\n" << endl;//源程序代码输入处理
//    instr="var a,b,c; a:=1; b:=2; c:=a+b";char ch[1000];string ins;
//    printf("%d\n",gets(ch));
//    printf("\n%d",&ch[1]);
//    cout<<gets(ch)<<endl;while(gets(ch)){FILE *fp;
//        char str[1000];map<string,int>::iterator iter;if((fp=fopen("d.txt","w"))==NULL){printf("error occur!\n");exit(1);}if((fp=fopen("d.txt","a"))==NULL){printf("error occur!\n");exit(1);}//        ins=ch;instr=ch;index=0;while (index < instr.size()){char* str=(char*)LexAnalyze().data();
//                    fprintf(fp,"%s\n",str);
//            cout<<str<<endl;if(strcmp(str,"#")==0){
//                printf("*");fprintf(fp,"%s",str);}else{iter=type.find(str);if(iter!=type.end())//                if(index==instr.size())fprintf(fp,"(%d,%s)\n",iter->second,str);
//                else
//                    fprintf(fp,"(%d,%s)\n",iter->second,str);else{iter=Digit.find(str);if(iter!=Digit.end())//                if(index==instr.size())fprintf(fp,"(28,%s)\n",str);
//                else
//                    fprintf(fp,"(28,%s)\n",str);}}}fclose(fp);//        cout<<instr<<endl;memset(ch,0,sizeof(ch));}yufafenxi();//    cout<<instr<<endl;
//    string in;
//    while (cin >> in&&in != "@")
//    {
//        instr = instr + " " + in;
//    }//识别二元组初始化
//    while (index < instr.size())
//    {
//        LexAnalyze();
//    }//展示构造的各种词汇表show_table();//    finish=clock();
//    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
//    cout<<totaltime<<endl;
//    //system("pause");return 0;}

 

框架2

//#include<bits/stdc++.h>
#include <fstream>
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<sstream>using namespace std;template <class Type> Type stringToNum(const string& str)
{istringstream iss(str);Type num;iss >> num;return num;
}int num=0;
int sum=0;ifstream infile("d.txt");//词法分析的结果或语法分析的输入
string str;//string变量进行字符识别
string sym; //指针
string sym1;
int temp=0;//int expressionAnalysis();//表达式分析
//int termAnaysis();//项分析
//int factorAnalysis();//因子分析
//int advance();
int E();
int E_plus();
int T();
int T_plus();
int F();int conterr=0;//记录错误
int lpnum=0;//记录左括号
int found;//提取字符串中指针的位置
string sym2;
int found1;
int flag=0;//记录往后移动一个指针SYM是否正确
string s;//用来保存要分析的字符串
struct _2tup
{string token;int id;
};int advance() //SYM的移动
{if(!getline(infile,str)) //从文件中提取字符{return 0;}
//    cout<<str<<endl;s+=str;
//    cout<<s<<endl;found=str.find(',',0);found1=str.find(')',0);
//    cout<<found1<<endl;if(found==-1) //当为error的时候,没有‘,’{conterr++;return 0;
//        cout<<"语法错误 识别字符错误"<<endl;
//        return -1;}if(temp==1)sym1=sym;sym=str.substr(1,found-1);sym2=str.substr(found+1,found1-found-1);num=stringToNum<int>(sym2);
//    cout<<num<<endl;return 1;
}int F()
{}
int T_plus()
{}
int T()
{}int E_plus()
{}int E()
{T();E_plus();}
void yufafenxi()//语法分析
{
//    freopen("CON", "w", stdout);//结果在控制台上输出
//    flag=advance();
//    if(flag)-
//    {advance();E();
//    advance();if(strcmp(str.data(),"#")!=0){printf("%s\n",s.data());printf("Error\n");}else{cout<<"OK:   "<<s<<endl;}
//    }
//    if(flag!=-1 && !conterr)
//    {
//    cout<<"正确:"<<s<<endl;
//    }}string instr;//输入符号串
int index;//当前输入符号读入字符的位置
char character;//全局变量字符,存放最新读入的字符
string token;//字符数组,存放已读入的字符序列
map<string, int> Symbol;//标识符集
map<string, int> Digit;//常数集
map<string, int> other;//other
map<string, int>::iterator ite;
const int len = 100;
string Reserve[len];//保留字表
map<string,int> type;
//void init_Reserve()  //构造保留字表的函数
//{
//    Reserve[1] = "begin";
//    Reserve[2] = "end";
//    Reserve[3] = "if";
//    Reserve[4] = "then";
//    Reserve[5] = "while";
//    Reserve[6] = "do";
//    Reserve[7] = "const";
//    Reserve[8] = "var";
//    Reserve[9] = "call";
//    Reserve[10] = "procedure";
//
//}
void getChar()  //读入一个字符
{character = instr[index++];
}
void getnbc()  //读入非空白字符
{while (character == ' '){getChar();}
}
void concat()  //连接字符串
{token = token + character;
}
bool letter()  //判断是否为字母
{if ((character >= 'A'&&character <= 'Z') || (character >= 'a'&&character <= 'z'))return true;return false;
}
bool digit()  //判断是否为数字
{if (character >= '0'&&character <= '9')return true;return false;
}
void retract() //回退字符的函数
{
//    character = ' ';index--;
}
int reserve()  //匹配保留字符
{for (int i = 0; i < len; i++)if (Reserve[i] == token)return i;return -1;
}
void symbol()
{ite = Symbol.find(token);if (ite != Symbol.end()){
//        return ite->first;return ;}else{Symbol[token] = Symbol.size();return ;
//        return token;}
}
void constant()
{ite = Digit.find(token);if (ite != Digit.end()){
//        return ite->first;return ;}else{Digit[token] = Digit.size();return ;
//        return token;}
}
void Three()
{ite = other.find(token);if (ite != other.end()){return ;
//        return ite->first;}else{other[token] = other.size();return ;
//        return token;}
}
void error()
{cout << token << "\t-->\t该单词不存在" << endl;
}
//词法分析函数,逐个识别单词
string LexAnalyze()
{token = "";getChar();getnbc();string val;
//    int num = -1;if(character>='a'&&character<='z' || character>='A'&&character<='Z'){while (letter() || digit())  //为字母或数字{concat();//追加到token末尾//            if(token=="odd")
//            {
//                getChar();
//                Three();
//                return ;
//            }getChar();//读取下一个字符}if(token=="odd"){getChar();Three();return 0;}retract();//回退一个字符{
//            val = symbol();//查看标识符表symbol();}}else if(character>='0' && character<='9'){int flag=0;while (character>='0' && character<='9' || character>='a' && character<='z' || character>='A' && character <='Z'){if(character>='0' && character<='9')concat();if(character>='a' && character<='z' || character>='A' && character <='Z'){concat();flag=1;}getChar();}if(flag==1){error();return 0;}retract();
//        val = constant();//查看常数表constant();}else if(character=='<'){concat();getChar();if (character == '='){concat();Three();
//返回<=符号}else if(character=='>'){concat();Three();}else{retract();Three();
//返回<符号}}else if(character=='>'){concat();getChar();if (character == '='){concat();Three();
//返回>=符号}else{retract();Three();
//返回>符号}}else if(character=='='){concat();getChar();if (character == '='){concat();Three();
//返回==符号}else{retract();Three();
//返回=符号}}else if(character==':'){concat();getChar();if (character == '='){concat();Three();}else{cout<<token<<endl;error();return 0;}}else if(character=='+'){concat();Three();}else if(character=='-'){concat();Three();}else if(character=='*'){concat();Three();}else if(character=='/'){concat();Three();}else if(character=='('){concat();Three();}else if(character==')'){concat();Three();}else if(character==','){concat();Three();}else if(character=='.'){concat();Three();}else if(character==';'){concat();Three();}else if(character=='#'){concat();return token;}else{error();return 0;}return token;}
void show_table()
{cout << "\n==================" << "标识符" << "==================" << endl;
//    cout << "标识符\t\t类别编码\t表中位置" << endl;for (ite=Symbol.begin(); ite != Symbol.end(); ite++){
//        int flag=0;
//        for (int i = 0; i < len; i++)
//        {
//               cout<<Reserve[i]<<endl;
//            if (Reserve[i] == ite->first)
//            {
//                cout<<ite->first<<"是保留字"<<"   ";
//                cout << "("<<ite->first <<","<<ite->second<<")" << endl;
//                flag=1;
//                break;
//            }
//
//
//        }
//        if(flag==0)
//            cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);if(iter!=type.end())cout << "("<<iter->second <<","<<ite->second<<")" << endl;elsecout << "("<<type.size() <<","<<ite->second<<")" << endl;}cout << "\n==================" << "常数表" << "==================" << endl;
//    cout << "常量值\t\t类别编码\t表中位置" << endl;for (ite = Digit.begin(); ite != Digit.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);
//        if(iter!=type.end())
//            cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//        elsecout << "("<<type.size()-1 <<","<<ite->second<<")" << endl;}cout << "\n==================" << "算符、界符" << "==================" << endl;for (ite = other.begin(); ite != other.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//           cout<<iter->second<<endl;}
}
int main()
{
//    clock_t start,finish;
//    double totaltime;
//    start=clock();type["begin"]=type.size();type["end"]=type.size();type["if"]=type.size();type["then"]=type.size();type["while"]=type.size();type["do"]=type.size();type["const"]=type.size();type["var"]=type.size();type["call"]=type.size();type["procedure"]=type.size();type["+"]=type.size();type["-"]=type.size();type["*"]=type.size();type["/"]=type.size();type["odd"]=type.size();type["="]=type.size();type["<>"]=type.size();type["<"]=type.size();type[">"]=type.size();type["<="]=type.size();type[">="]=type.size();type[":="]=type.size();type["("]=type.size();type[")"]=type.size();type[","]=type.size();type["."]=type.size();type[";"]=type.size();type["常数"]=type.size();type["标识符"]=type.size();//    init_Reserve();//保留字表初始化Symbol.clear();//标识符集初始化Digit.clear();//常数集初始化index = 0;character = ' ';token = "";cout << "请输入待词法分析的源程序代码:输入文件结束符结束输入\n" << endl;//源程序代码输入处理
//    instr="var a,b,c; a:=1; b:=2; c:=a+b";char ch[1000];string ins;
//    printf("%d\n",gets(ch));
//    printf("\n%d",&ch[1]);
//    cout<<gets(ch)<<endl;while(gets(ch)){FILE *fp;
//        char str[1000];map<string,int>::iterator iter;if((fp=fopen("d.txt","w"))==NULL){printf("error occur!\n");exit(1);}if((fp=fopen("d.txt","a"))==NULL){printf("error occur!\n");exit(1);}//        ins=ch;instr=ch;index=0;while (index < instr.size()){char* str=(char*)LexAnalyze().data();
//                    fprintf(fp,"%s\n",str);
//            cout<<str<<endl;if(strcmp(str,"#")==0){
//                printf("*");fprintf(fp,"%s",str);}else{iter=type.find(str);if(iter!=type.end())//                if(index==instr.size())fprintf(fp,"(%d,%s)\n",iter->second,str);
//                else
//                    fprintf(fp,"(%d,%s)\n",iter->second,str);else{iter=Digit.find(str);if(iter!=Digit.end())//                if(index==instr.size())fprintf(fp,"(28,%s)\n",str);
//                else
//                    fprintf(fp,"(28,%s)\n",str);}}}fclose(fp);//        cout<<instr<<endl;memset(ch,0,sizeof(ch));}yufafenxi();//    cout<<instr<<endl;
//    string in;
//    while (cin >> in&&in != "@")
//    {
//        instr = instr + " " + in;
//    }//识别二元组初始化
//    while (index < instr.size())
//    {
//        LexAnalyze();
//    }//展示构造的各种词汇表show_table();//    finish=clock();
//    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
//    cout<<totaltime<<endl;
//    //system("pause");return 0;}

 

 

词法分析得到的结果存放在同级目录  d.txt 中。 

 

 

 

程序:

//#include<bits/stdc++.h>
#include <fstream>
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<sstream>using namespace std;template <class Type> Type stringToNum(const string& str)
{istringstream iss(str);Type num;iss >> num;return num;
}int num=0;
int sum=0;ifstream infile("d.txt");//词法分析的结果或语法分析的输入
string str;//string变量进行字符识别
string sym; //指针
string sym1;
int temp=0;//int expressionAnalysis();//表达式分析
//int termAnaysis();//项分析
//int factorAnalysis();//因子分析
//int advance();
int E();
int E_plus();
int T();
int T_plus();
int F();int conterr=0;//记录错误
int lpnum=0;//记录左括号
int found;//提取字符串中指针的位置
string sym2;
int found1;
int flag=0;//记录往后移动一个指针SYM是否正确
string s;//用来保存要分析的字符串
struct _2tup
{string token;int id;
};int advance() //SYM的移动
{if(!getline(infile,str)) //从文件中提取字符{return 0;}
//    cout<<str<<endl;s+=str;
//    cout<<s<<endl;found=str.find(',',0);found1=str.find(')',0);
//    cout<<found1<<endl;if(found==-1) //当为error的时候,没有‘,’{conterr++;return 0;
//        cout<<"语法错误 识别字符错误"<<endl;
//        return -1;}if(temp==1)sym1=sym;sym=str.substr(1,found-1);sym2=str.substr(found+1,found1-found-1);num=stringToNum<int>(sym2);
//    cout<<num<<endl;return 1;
}int F()
{if(sym=="28"){advance();}else{if(sym=="23"){advance();E();if(sym=="24"){advance();}else{printf("Error!\n");exit(1);}}else{printf("Error!\n");exit(1);}}return 0;}
int T_plus()
{if(sym=="13" || sym=="14") // 如果是 *  /{advance();T();E_plus();}
}
int T()
{F();T_plus();}int E_plus()
{if(sym=="11" || sym=="12")  // 如果是+ 或者 -{advance();T();E_plus();}
}int E()
{T();E_plus();}
void yufafenxi()//语法分析
{
//    freopen("CON", "w", stdout);//结果在控制台上输出
//    flag=advance();
//    if(flag)-
//    {advance();E();
//    advance();if(strcmp(str.data(),"#")!=0){printf("%s\n",s.data());printf("Error\n");}else{cout<<"OK:   "<<s<<endl;}
//    }
//    if(flag!=-1 && !conterr)
//    {
//    cout<<"正确:"<<s<<endl;
//    }}string instr;//输入符号串
int index;//当前输入符号读入字符的位置
char character;//全局变量字符,存放最新读入的字符
string token;//字符数组,存放已读入的字符序列
map<string, int> Symbol;//标识符集
map<string, int> Digit;//常数集
map<string, int> other;//other
map<string, int>::iterator ite;
const int len = 100;
string Reserve[len];//保留字表
map<string,int> type;
//void init_Reserve()  //构造保留字表的函数
//{
//    Reserve[1] = "begin";
//    Reserve[2] = "end";
//    Reserve[3] = "if";
//    Reserve[4] = "then";
//    Reserve[5] = "while";
//    Reserve[6] = "do";
//    Reserve[7] = "const";
//    Reserve[8] = "var";
//    Reserve[9] = "call";
//    Reserve[10] = "procedure";
//
//}
void getChar()  //读入一个字符
{character = instr[index++];
}
void getnbc()  //读入非空白字符
{while (character == ' '){getChar();}
}
void concat()  //连接字符串
{token = token + character;
}
bool letter()  //判断是否为字母
{if ((character >= 'A'&&character <= 'Z') || (character >= 'a'&&character <= 'z'))return true;return false;
}
bool digit()  //判断是否为数字
{if (character >= '0'&&character <= '9')return true;return false;
}
void retract() //回退字符的函数
{
//    character = ' ';index--;
}
int reserve()  //匹配保留字符
{for (int i = 0; i < len; i++)if (Reserve[i] == token)return i;return -1;
}
void symbol()
{ite = Symbol.find(token);if (ite != Symbol.end()){
//        return ite->first;return ;}else{Symbol[token] = Symbol.size();return ;
//        return token;}
}
void constant()
{ite = Digit.find(token);if (ite != Digit.end()){
//        return ite->first;return ;}else{Digit[token] = Digit.size();return ;
//        return token;}
}
void Three()
{ite = other.find(token);if (ite != other.end()){return ;
//        return ite->first;}else{other[token] = other.size();return ;
//        return token;}
}
void error()
{cout << token << "\t-->\t该单词不存在" << endl;
}
//词法分析函数,逐个识别单词
string LexAnalyze()
{token = "";getChar();getnbc();string val;
//    int num = -1;if(character>='a'&&character<='z' || character>='A'&&character<='Z'){while (letter() || digit())  //为字母或数字{concat();//追加到token末尾//            if(token=="odd")
//            {
//                getChar();
//                Three();
//                return ;
//            }getChar();//读取下一个字符}if(token=="odd"){getChar();Three();return 0;}retract();//回退一个字符{
//            val = symbol();//查看标识符表symbol();}}else if(character>='0' && character<='9'){int flag=0;while (character>='0' && character<='9' || character>='a' && character<='z' || character>='A' && character <='Z'){if(character>='0' && character<='9')concat();if(character>='a' && character<='z' || character>='A' && character <='Z'){concat();flag=1;}getChar();}if(flag==1){error();return 0;}retract();
//        val = constant();//查看常数表constant();}else if(character=='<'){concat();getChar();if (character == '='){concat();Three();
//返回<=符号}else if(character=='>'){concat();Three();}else{retract();Three();
//返回<符号}}else if(character=='>'){concat();getChar();if (character == '='){concat();Three();
//返回>=符号}else{retract();Three();
//返回>符号}}else if(character=='='){concat();getChar();if (character == '='){concat();Three();
//返回==符号}else{retract();Three();
//返回=符号}}else if(character==':'){concat();getChar();if (character == '='){concat();Three();}else{cout<<token<<endl;error();return 0;}}else if(character=='+'){concat();Three();}else if(character=='-'){concat();Three();}else if(character=='*'){concat();Three();}else if(character=='/'){concat();Three();}else if(character=='('){concat();Three();}else if(character==')'){concat();Three();}else if(character==','){concat();Three();}else if(character=='.'){concat();Three();}else if(character==';'){concat();Three();}else if(character=='#'){concat();return token;}else{error();return 0;}return token;}
void show_table()
{cout << "\n==================" << "标识符" << "==================" << endl;
//    cout << "标识符\t\t类别编码\t表中位置" << endl;for (ite=Symbol.begin(); ite != Symbol.end(); ite++){
//        int flag=0;
//        for (int i = 0; i < len; i++)
//        {
//               cout<<Reserve[i]<<endl;
//            if (Reserve[i] == ite->first)
//            {
//                cout<<ite->first<<"是保留字"<<"   ";
//                cout << "("<<ite->first <<","<<ite->second<<")" << endl;
//                flag=1;
//                break;
//            }
//
//
//        }
//        if(flag==0)
//            cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);if(iter!=type.end())cout << "("<<iter->second <<","<<ite->second<<")" << endl;elsecout << "("<<type.size() <<","<<ite->second<<")" << endl;}cout << "\n==================" << "常数表" << "==================" << endl;
//    cout << "常量值\t\t类别编码\t表中位置" << endl;for (ite = Digit.begin(); ite != Digit.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);
//        if(iter!=type.end())
//            cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//        elsecout << "("<<type.size()-1 <<","<<ite->second<<")" << endl;}cout << "\n==================" << "算符、界符" << "==================" << endl;for (ite = other.begin(); ite != other.end(); ite++){
//        cout << "("<<ite->first <<","<<ite->second<<")" << endl;map<string,int>::iterator iter;iter=type.find(ite->first);cout << "("<<iter->second <<","<<ite->second<<")" << endl;
//           cout<<iter->second<<endl;}
}
int main()
{
//    clock_t start,finish;
//    double totaltime;
//    start=clock();type["begin"]=type.size();type["end"]=type.size();type["if"]=type.size();type["then"]=type.size();type["while"]=type.size();type["do"]=type.size();type["const"]=type.size();type["var"]=type.size();type["call"]=type.size();type["procedure"]=type.size();type["+"]=type.size();type["-"]=type.size();type["*"]=type.size();type["/"]=type.size();type["odd"]=type.size();type["="]=type.size();type["<>"]=type.size();type["<"]=type.size();type[">"]=type.size();type["<="]=type.size();type[">="]=type.size();type[":="]=type.size();type["("]=type.size();type[")"]=type.size();type[","]=type.size();type["."]=type.size();type[";"]=type.size();type["常数"]=type.size();type["标识符"]=type.size();//    init_Reserve();//保留字表初始化Symbol.clear();//标识符集初始化Digit.clear();//常数集初始化index = 0;character = ' ';token = "";cout << "请输入待词法分析的源程序代码:输入文件结束符结束输入\n" << endl;//源程序代码输入处理
//    instr="var a,b,c; a:=1; b:=2; c:=a+b";char ch[1000];string ins;
//    printf("%d\n",gets(ch));
//    printf("\n%d",&ch[1]);
//    cout<<gets(ch)<<endl;while(gets(ch)){FILE *fp;
//        char str[1000];map<string,int>::iterator iter;if((fp=fopen("d.txt","w"))==NULL){printf("error occur!\n");exit(1);}if((fp=fopen("d.txt","a"))==NULL){printf("error occur!\n");exit(1);}//        ins=ch;instr=ch;index=0;while (index < instr.size()){char* str=(char*)LexAnalyze().data();
//                    fprintf(fp,"%s\n",str);
//            cout<<str<<endl;if(strcmp(str,"#")==0){
//                printf("*");fprintf(fp,"%s",str);}else{iter=type.find(str);if(iter!=type.end())//                if(index==instr.size())fprintf(fp,"(%d,%s)\n",iter->second,str);
//                else
//                    fprintf(fp,"(%d,%s)\n",iter->second,str);else{iter=Digit.find(str);if(iter!=Digit.end())//                if(index==instr.size())fprintf(fp,"(28,%s)\n",str);
//                else
//                    fprintf(fp,"(28,%s)\n",str);}}}fclose(fp);//        cout<<instr<<endl;memset(ch,0,sizeof(ch));}yufafenxi();//    cout<<instr<<endl;
//    string in;
//    while (cin >> in&&in != "@")
//    {
//        instr = instr + " " + in;
//    }//识别二元组初始化
//    while (index < instr.size())
//    {
//        LexAnalyze();
//    }//展示构造的各种词汇表show_table();//    finish=clock();
//    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
//    cout<<totaltime<<endl;
//    //system("pause");return 0;}

 

 

要求实现以下效果:

 

 

 

更多推荐

编译原理 第二次实验 语法分析 按照崔老师上午授课内容写出来框架

本文发布于:2024-03-13 03:02:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733042.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:语法   框架   原理   上午   老师

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!