编译原理实验(词法分析器+语法分析器(递归下降法))

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<

你可能感兴趣的:(课设&实验)