算符优先分析过程只考虑算符(终结符)之间的优先关系,分析扫描每个规约式的算符间优先关系。
根据龙书阐述,算符优先分析逐渐淘汰了。orz
但仍然实现之。
示例语法如下:
D->#E#
E->E+T|T
T->T*F|F
F->P$F|P
P->(E)|i
main.cpp
#include <iostream>
#include <vector>
#include "grammerin.h"
#include "calculatepriortable.h"
#include "analy.h"
using namespace std;
int main()
{
vector<vector<char> > sign;
cout<<"读入语法规则:"<<endl;
sign=readGrammer();
/*
for(int i=0;i<2;++i)
{
for(int j=0;j<sign[i].size();++j)
cout<<sign[i][j]<<" ";
cout<<endl;
}
*/
vector<vector<vector<char> > > vvvc;
vvvc = createfirstandfollow(sign);
vector<vector<char> > priortable;
priortable=createtable(vvvc);
while(true)
{
cout<<endl<<"input: ";
string s;
cin>>s;
inStringAnalyze(s,priortable);
}
return 0;
}
grammerin.cpp:
#ifndef GRMMERIN_H
#define GRMMERIN_H
#include <vector>
using namespace std;
vector< vector<char> > readGrammer();
vector< vector<char> > readGrammerWithNoPrint();
vector<string> getgrammer();
#endif
grammerin.h:
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <cctype>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
vector< vector<char> > readGrammer()
{
vector<char> terminatesign,unterminatesign;
string s,grammer;
ifstream in("C:\\Users\\lsy\\Desktop\\grammer1.txt");
if (! in.is_open())
{ cout << "Error opening file"; exit (1); }
while (!in.eof() )
{
char lin[100];
//in.getline(buffer);
in.getline(lin,100);
s+=lin;
grammer+=s+"\n";
//cout <<s<< endl;
int k=s.find_first_of("->");
for(int i=0;i<k;++i)
{
//cout<<s[i]<<endl;
vector<char>::iterator result = find(unterminatesign.begin(),unterminatesign.end(),s[i]);
if(result==unterminatesign.end())
unterminatesign.push_back(s[i]);
}
for(int i=k+2;i<s.size();++i)
{
//cout<<s[i]<<endl;
if((s[i]>='A'&&s[i]<='Z')||s[i]==' '||s[i]=='|')
;
else
{
vector<char>::iterator result = find(terminatesign.begin(),terminatesign.end(),s[i]);
if(result==terminatesign.end())
terminatesign.push_back(s[i]);
}
}
s="";
}
cout<<grammer;
cout<<endl<<"·ÇÖÕ½á·û£º"<<endl;
for(int i=0;i<unterminatesign.size();++i)
cout<<unterminatesign[i]<<" ";
cout<<endl;
cout<<"ÖÕ½á·û£º"<<endl;
for(int i=0;i<terminatesign.size();++i)
cout<<terminatesign[i]<<" ";
cout<<endl;
vector<vector<char> > returnvector;
returnvector.push_back(unterminatesign);
returnvector.push_back(terminatesign);
return returnvector;
}
vector< vector<char> > readGrammerWithNoPrint()
{
//system("chcp 65001");
vector<char> terminatesign,unterminatesign;
string s,grammer;
ifstream in("C:\\Users\\lsy\\Desktop\\grammer1.txt");
if (! in.is_open())
{ cout << "Error opening file"; exit (1); }
while (!in.eof() )
{
char lin[100];
//in.getline(buffer);
in.getline(lin,100);
s+=lin;
grammer+=s+"\n";
//cout <<s<< endl;
int k=s.find_first_of("->");
for(int i=0;i<k;++i)
{
//cout<<s[i]<<endl;
vector<char>::iterator result = find(unterminatesign.begin(),unterminatesign.end(),s[i]);
if(result==unterminatesign.end())
unterminatesign.push_back(s[i]);
}
for(int i=k+2;i<s.size();++i)
{
//cout<<s[i]<<endl;
if((s[i]>='A'&&s[i]<='Z')||s[i]==' '||s[i]=='|')
;
else
{
vector<char>::iterator result = find(terminatesign.begin(),terminatesign.end(),s[i]);
if(result==terminatesign.end())
terminatesign.push_back(s[i]);
}
}
s="";
}
vector<vector<char> > returnvector;
returnvector.push_back(unterminatesign);
returnvector.push_back(terminatesign);
return returnvector;
}
vector<string> getgrammer()
{
string s;
vector<string> vv;
ifstream in("C:\\Users\\lsy\\Desktop\\grammer1.txt");
if (! in.is_open())
{ cout << "Error opening file"; exit (1);