1.分析C++词法,判断首位为数字的错误变量
通过对C++词法分析程序(GETSYM)的分析,并在此基础上按照教材附录A中给出的C++语言的语法描述,编写一个C++语言的词法分析程序。此程序应具有如下功能:
输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词、类别)所组成的二元组序列。
有一定检查错误的能力,例如发现2A这类不能作为单词的字符串。
这里借鉴了一些其他博主的,然后我进行了一些改进,适用于我们实验课
#include
using namespace std;
string KEYWORD[19]={"if","else","void","return","while","then","for","do", //关键字
"int","char","double","float","case","cin","cout","include","using","namespace","iostream"};
char SEPARATER[8]={';',',','{','}','[',']','(',')'}; //分隔符
char OPERATOR[9]={'+','-','*','/','>','<','=','!','#'}; //运算符
char Muloperator[9][2]={{'+','='},{'-','='},{'*','='},{'/','='},{'+','+'},{'-','-'},{'<','='},{'>','='},{'=','='}};
char FILTER[4]={' ','\t','\r','\n'}; //过滤符
const int IDENTIFIER=100; //标识符值
const int CONSTANT=101; //常数值
const int FILTER_VALUE=102; //过滤字符值
/**判断是否为关键字**/
bool IsKeyword(string word){
for(int i=0;i<19;i++){
if(KEYWORD[i]==word){
return true;
}
}
return false;
}
/**判断是否为分隔符**/
bool IsSeparater(char ch){
for(int i=0;i<8;i++){
if(SEPARATER[i]==ch){
return true;
}
}
return false;
}
/**判断是否为运算符**/
bool IsOperator(char ch){
for(int i=0;i<9;i++){
if(OPERATOR[i]==ch){
return true;
}
}
return false;
}
/**判断是否为多位运算符**/
bool IsMuloperator(char ch[]){
for(int i=0;i<9;i++){
if(ch[0]==Muloperator[i][0]&&ch[1]==Muloperator[i][1])return true;
}
return false;
}
/**判断是否为过滤符**/
bool IsFilter(char ch){
for(int i=0;i<4;i++){
if(FILTER[i]==ch){
return true;
}
}
return false;
}
/**判断是否为大写字母**/
bool IsUpLetter(char ch){
if(ch>='A' && ch<='Z') return true;
return false;
}
/**判断是否为小写字母**/
bool IsLowLetter(char ch){
if(ch>='a' && ch<='z') return true;
return false;
}
/**判断是否为数字**/
bool IsDigit(char ch){
if(ch>='0' && ch<='9') return true;
return false;
}
/**返回每个字的值**/
template
int value(T *a,int n,T str){
for(int i=0;i>inFile;
if(()!=NULL)
break;
else{
cout<<"文件名错误!"<
2.语法分析器,分析LL(1)文法,用递归下降法(就是递归写。。。)
(1)本分析程序所分析的文法如下:
G[E]:
E→eBaA
A→a|bAcB
B→dEd|aC
C→e|dC
(2)针对上述文法编写一递归子程序分析程序,该程序的输入是任意符号串,输出是本次输入的符号串是否是该文法的句子的结论。
#include
using namespace std;
const int maxn=1e3;
string a;
int pos,len;
int A(int x);
int B(int x);
int C(int x);
int E(int x);
int A(int pos){
//if(a[pos]=='#')return pos+1;
if(a[pos]=='a')return pos+1;
if(a[pos]=='b'){
pos=A(pos+1);
if(pos<0)return -1;
if(a[pos]=='c'){
pos=B(pos+1);
if(pos<0)return -1;
else return pos;
}
else return -1;
}
else return -1;
}
int B(int pos){
//if(a[pos]=='#')return pos+1;
if(a[pos]=='d'){
pos=E(pos+1);
if(pos<0)return -1;
if(a[pos]=='d')return pos+1;
else return -1;
}
else if(a[pos]=='a'){
pos=C(pos+1);
if(pos<0)return -1;
return pos;
}
else return -1;
}
int C(int pos){
//if(a[pos]=='#')return pos+1;
if(a[pos]=='e'){
return pos+1;
}
else if(a[pos]=='d'){
pos=C(pos+1);
if(pos<0)return -1;
return pos;
}
else return -1;
}
int E(int pos){
//if(a[pos]=='#')return pos+1;
if(a[pos]=='e'){
pos++;
pos=B(pos);
if(pos<0)return -1;
if(a[pos]=='a'){
pos++;
pos=A(pos);
if(pos<0)return -1;
else return pos;
}
else return -1;
}
else return -1;
}
int main(){
freopen("1.txt","r",stdin);
while(cin>>a){
a+='#';
len=a.size()-1;
if(E(0)==len)cout<