词法、语法、语义分析实验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bmicnj/article/details/78904932

一、词法分析

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char *rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
void scanner(){
    //整数,字符(串),其他
    for(int i=0; i<16; i++) {
        token[i]=NULL;
    }
    ch=program[p++];
    while(ch==' '){
        ch=program[p];
        p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        m=0;
        while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){
            token[m++]=ch;
            ch=program[p++];
        }
        token[m++]='\0';
        p--;
        syn=10;
        for(int i=0; i<6; i++) {
            if(strcmp(token, rwtab[i])==0) {
                syn=i+1;
                break;
            }
        }
    }
    else if(ch>='0' && ch<='9') {
        sum=0;
        while(ch>='0' && ch<='9') {
            sum=sum*10+ch-'0';
            ch=program[p++];
        }
        p--;
        syn=11;
        if(sum>65536)
            syn=-1;
    }
    else switch(ch) {
        case '+':syn=13; token[0]='+';  break;
        case '-':syn=14; token[0]='-';break;
        case '*':syn=15; token[0]='*'; break;
        case '/':syn=16; token[0]='/'; break;
        case ':':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=18;
            }
            else {
                syn=17;
                p--;
            }
            break;
        case '<':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='>') {
                token[m++]=ch;
                syn=21;
            }
            else if(ch=='=') {
                token[m++]=ch;
                syn=22;
            }
            else {
                syn=20;
                p--;
            }
            break;
        case '>':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=24;
            }
            else {
                syn=23;
                p--;
            }
            break;
        case '=':syn=25; token[0]=ch;break;
        case ';':syn=26; token[0]=ch;break;
        case '(':syn=27; token[0]=ch;break;
        case ')':syn=28; token[0]=ch;break;
        case '#':syn=0; token[0]=ch;break;
        default: syn=-1;break;

    }
}
int main()
{
    p=0;
    printf("please input string:\n");
    do{
        ch=cin.get();
        program[p++]=ch;
    }while(ch!='#');
    p=0;
    do {
        scanner();
        switch(syn) {
            case 11:cout<<"<"<<syn<<","<<sum<<">"<<endl; break;
            case -1:cout<<"Error"<<endl; break;
            default:cout<<"<"<<syn<<","<<token<<">"<<endl; break;
        }
    }while(syn!=0);
    return 0;
}



二、语法分析


#include <iostream>
#include <cstdio>
#include <cstring>
#include <String>
using namespace std;

int sign=1;

string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
int kk;//出错处理标记

void scanner();
void factor();
void term();
void expression();
void statement();
void statementString();
void irparser();

void scanner(){
    //整数,字符(串),其他
    char token[16];
    ch=program[p++];
    while(ch==' '){
        ch=program[p];
        p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        m=0;
        while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){
            token[m++]=ch;
            ch=program[p++];
        }
        token[m++]='\0';
        p--;
        syn=10;
        for(int i=0; i<6; i++) {
            if((string(token)==rwtab[i])) {
                syn=i+1;
                break;
            }
        }
    }
    else if(ch>='0' && ch<='9') {
        sum=0;
        while(ch>='0' && ch<='9') {
            sum=sum*10+ch-'0';
            ch=program[p++];
        }
        p--;
        syn=11;
        if(sum>65536)
            syn=-1;
    }
    else switch(ch) {
        case '+':syn=13; token[0]='+';  break;
        case '-':syn=14; token[0]='-';break;
        case '*':syn=15; token[0]='*'; break;
        case '/':syn=16; token[0]='/'; break;
        case ':':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=18;
            }
            else {
                syn=17;
                p--;
            }
            break;
        case '<':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='>') {
                token[m++]=ch;
                syn=21;
            }
            else if(ch=='=') {
                token[m++]=ch;
                syn=22;
            }
            else {
                syn=20;
                p--;
            }
            break;
        case '>':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=24;
            }
            else {
                syn=23;
                p--;
            }
            break;
        case '=':syn=25; token[0]=ch;break;
        case ';':syn=26; token[0]=ch;break;
        case '(':syn=27; token[0]=ch;break;
        case ')':syn=28; token[0]=ch;break;
        case '#':syn=0; token[0]=ch;break;
        default: syn=-1;break;

    }
}

void factor() { //因子
    if(syn==10) {//::调用,继续扫描
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
    }
    else if(syn==11) {//::调用,继续扫描
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
    }
    else if(syn==27) {
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        expression();
        if(syn==28) {//::调用,继续扫描
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
        }
        else {
            cout<<"error:没有匹配的')' !"<<endl;
            kk=1;
        }
    }
    else {
        cout<<"error:不是factor !"<<endl;
        kk=1;
    }
    return ;
}

void term() { //项
    factor();
    while(syn==15 || syn==16) { //*、/
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        factor();
    }
    return ;//::出错处理
}

void expression() { //表达式
    term();
    while(syn==13 || syn==14) {//+、-
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        term();
    }
    return ;//::出错处理
}

void statement() { //语句,赋值语句
    if(syn==10) { //标识符
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        if(syn==18) { //:=
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
            expression();
        }
        else {
            cout<<"error:不是赋值语句 !"<<endl;
            kk=1;
        }
    }
    else {
        cout<<"error:不是语句 !"<<endl;
        kk=1;
    }
    return ;
}

void statementString() { //语句串
    statement();
    while(syn==26) { //;
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        statement();
    }
    return ;//::出错处理
}

void irparser() { //程序
    if(syn==1) { //begin
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        statementString();
        if(syn==6) { //end
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
            if(syn==0&&kk==0) {
                cout<<"success !"<<endl;
            }
            /*
            else { //一定会有#标志,否则输入不会结束
                cout<<"没有结束标志 !"<<endl;
                kk=1;
            }*/
        }
        else {
            if(kk==0){
                cout<<"error:没有end !"<<endl;
                kk=1;
            }
        }
    }
    else {
        cout<<"error:没有begin !"<<endl;
        kk=1;
    }
    return ;
}


int main()
{
    p=0;
    kk=0;
    printf("please input string:\n");
    do{
        ch=cin.get();
        program[p++]=ch;
    }while(ch!='#');
    p=0;
    scanner();
    //cout<<sign++<<"==syn=="<<syn<<endl;
    irparser();

    return 0;
}






三、语义分析


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <String>
#include <malloc.h>
using namespace std;

string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m,q;//下标
int kk;//出错处理标记

struct {
    char result1[8];
    char ag11[8];
    char op1[8];
    char ag21[8];
}quad[20];

char *newtemp();//新形式
void emit(string result, string ag1, string op, string ag2);

void irparser();
int statementString();
int statement();
char *expression();
char *term();
char *factor();
void scanner();
char *newtemp() {
    char *p;
    char m[8];
    p=(char *)malloc(8);
    kk++;
    itoa(kk,m,10);
    strcpy(p+1,m);
    p[0]='t';
    return (p);
}
//结果 值一 运算符  值二
void emit(char *result, char *ag1, char *op, char *ag2) {
    strcpy(quad[q].result1,result);
    strcpy(quad[q].ag11,ag1);
    strcpy(quad[q].op1,op);
    strcpy(quad[q].ag21,ag2);
    q++;
    return ;
}

void scanner(){
    //整数,字符(串),其他
    char token[16];
    ch=program[p++];
    while(ch==' '){
        ch=program[p];
        p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        m=0;
        while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){
            token[m++]=ch;
            ch=program[p++];
        }
        token[m++]='\0';
        p--;
        syn=10;
        for(int i=0; i<6; i++) {
            if((string(token)==rwtab[i])) {
                syn=i+1;
                break;
            }
        }
    }
    else if(ch>='0' && ch<='9') {
        sum=0;
        while(ch>='0' && ch<='9') {
            sum=sum*10+ch-'0';
            ch=program[p++];
        }
        p--;
        syn=11;
        if(sum>65536)
            syn=-1;
    }
    else switch(ch) {
        case '+':syn=13; token[0]='+';  break;
        case '-':syn=14; token[0]='-';break;
        case '*':syn=15; token[0]='*'; break;
        case '/':syn=16; token[0]='/'; break;
        case ':':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=18;
            }
            else {
                syn=17;
                p--;
            }
            break;
        case '<':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='>') {
                token[m++]=ch;
                syn=21;
            }
            else if(ch=='=') {
                token[m++]=ch;
                syn=22;
            }
            else {
                syn=20;
                p--;
            }
            break;
        case '>':m=0; token[m++]=ch;
            ch=program[p++];
            if(ch=='=') {
                token[m++]=ch;
                syn=24;
            }
            else {
                syn=23;
                p--;
            }
            break;
        case '=':syn=25; token[0]=ch;break;
        case ';':syn=26; token[0]=ch;break;
        case '(':syn=27; token[0]=ch;break;
        case ')':syn=28; token[0]=ch;break;
        case '#':syn=0; token[0]=ch;break;
        default: syn=-1;break;

    }
}

char *factor() { //因子
    char *fplace;
    fplace=(char *)malloc(12);
    if(syn==10) {// '*' 调用,继续扫描
        strcpy(fplace,token);
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
    }
    else if(syn==11) {// '/' 调用,继续扫描
        itoa(sum,fplace,10);
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
    }
    else if(syn==27) {
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        fplace=expression();
        if(syn==28) {//::调用,继续扫描
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
        }
        else {
            cout<<"error:没有匹配的')' !"<<endl;
            kk=1;
            exit(0);
        }
    }
    else {
        cout<<"error:不是factor !"<<endl;
        kk=1;
        exit(0);
    }
    return (fplace);
}

char *term() { //项
    char *tp,*ep2,*eplace,*tt;
    tp=(char *)malloc(12);
    ep2=(char *)malloc(12);
    eplace=(char *)malloc(12);
    tt=(char *)malloc(12);
    strcpy(eplace,factor());
    while((syn==15) || (syn==16)) { //*、/
        if(syn==15) strcpy(tt,"*");
        else strcpy(tt,"/");
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        strcpy(ep2,factor());
        strcpy(tp,newtemp());
        emit(tp,eplace,tt,ep2);//
        strcpy(eplace,tp);
    }
    return (eplace);
}

char *expression() { //表达式
    char *tp,*ep2,*eplace,*tt;
    tp=(char *)malloc(12);
    ep2=(char *)malloc(12);
    eplace=(char *)malloc(12);
    tt=(char *)malloc(12);
    strcpy(eplace,term());
    while((syn==13) || (syn==14)) {//+、-
        if(syn==13) strcpy(tt,"+");
        else strcpy(tt,"-");
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        strcpy(ep2,term());
        strcpy(tp,newtemp());
        emit(tp,eplace,tt,ep2);
        strcpy(eplace,tp);
    }
    return (eplace);
}

int statement() { //语句,赋值语句
    char tt[8],eplace[8];
    int schain=0;
    if(syn==10) { //标识符
        strcpy(tt,token);
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        if(syn==18) { //:=
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
            strcpy(eplace,expression());
            emit(tt,eplace,"","");
            schain=0;
        }
        else {
            cout<<"error:不是赋值语句 !"<<endl;
            kk=1;
            exit(0);
        }
    }
    else {
        cout<<"error:不是语句 !"<<endl;
        kk=1;
    }
    return (schain);
}

int statementString() { //语句串
    int schain=0;
    schain=statement();
    while(syn==26) { //;
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl;
        schain=statement();
    }
    return (schain);
}

void irparser() { //程序
    int schain=0;
    kk=0;
    if(syn==1) { //begin
        scanner();
        //cout<<sign++<<"==syn=="<<syn<<endl
        schain=statementString();
        if(syn==6) { //end
            scanner();
            //cout<<sign++<<"==syn=="<<syn<<endl;
            if((syn==0)&&(kk==0)) {
                cout<<"success !"<<endl;
            }
            /*
            else { //一定会有#标志,否则输入不会结束
                cout<<"没有结束标志 !"<<endl;
                kk=1;
            }*/
        }
        else {
            if(kk==0)
                cout<<"error:没有end !"<<endl;
            kk=1;
            exit(0);
        }
    }
    else {
        cout<<"error:没有begin !"<<endl;
        kk=1;
        exit(0);
    }
  //  return (schain);
}

int main()
{
    p=0;
    kk=0;
    q=0;
    printf("please input string:\n");
    do{
        ch=cin.get();
        program[p++]=ch;
    }while(ch!='#');
    p=0;
    scanner();
    //cout<<sign++<<"==syn=="<<syn<<endl;
    irparser();
    printf("result\tval1\top\tval2\n");
    for(int i=0; i<q; i++) { //输出三地址代码
        cout<<quad[i].result1<<"\t"<<quad[i].ag11<<"\t"<<quad[i].op1<<"\t"<<quad[i].ag21<<endl;
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/bmicnj/article/details/78904932