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

本文详细探讨了词法分析、语法分析和语义分析的实验过程,涵盖了从源代码到可理解形式的关键步骤。
摘要由CSDN通过智能技术生成

一、词法分析

#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;
}

二、语法分析

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值