⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 词法分析1.txt

📁 编译原理的词法分析实验
💻 TXT
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<process.h>
static int i(0),j(0),t;
struct letter        //供输入字符串的结构体
{
    char str[15];
    int sign;         //编码::标识符保留字1 常数2 其他字符 3
}STR[100];

void main()
{
    FILE *fp;
    void kwordanalyse(char str[]);   //关键字和标识符分析程序
    void numanalyse(char []);     //常数分析程序
    void othword(char []);       //其他单词分析程序
    void key(char [],char *st[],int i);
    void num(char [],int i);
    void oth(char [],char *st[],int i);
    char *Keyword[50]={"int","char","float","void","const","if","else","then","repeat",
        "until","read","write","end","\n","+","-","*","/","%","?",":",">","<",
        "=",">=","<=","==","(",")","[","]","{","}",",",";","\'","\"","++","--"};
    char str[500]={0},ch,ch1;
    int tem;
    char s[20];
    cout<<"\t\t\t   词法分析小程序\n"<<endl;
    cout<<" 是否采用读文件的方式读入代码?(y/n):";
    cin>>ch1;
    if(ch1!='n')
    {
    cout<<"输入文件名:";
    cin>>s;
    if((fp=fopen(s,"r"))==NULL)
    {
        cout<<"未找到文件!";
        getchar();
        exit(0);
    }
    for(int n=0;(ch=fgetc(fp))!=EOF;n++)
    {
        str[n]=ch;
        putchar(str[i]);
    }
    fclose(fp);
    system("cls");
    cout<<"\t\t\t   词法分析小程序\n"<<endl;
    cout<<"\t文件"<<s<<"的内容为:"<<endl;
    cout<<str<<endl;
    }
    else
    {
        cout<<"请输入您的字符串代码:"<<endl;
    gets(str);
    system("cls");
    cout<<"\t\t\t   词法分析小程序\n"<<endl;
    cout<<"\t您的输入为:"<<str<<endl;
    }
    cout<<"\t输出的二元组如下:"<<endl;
    while(i<(int)strlen(str))         //通过循环分析输入的程序代码
    {
        if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<'Z'))
        {
            STR[j].sign=1;
            t=0;
            kwordanalyse(str);                                         
        }
        else 
            if(str[i]>='0'&&str[i]<='9')
            {
                STR[j].sign=2;
                t=0;
                numanalyse(str);
            }
            else
                if(str[i]!=' ')
            {
                STR[j].sign=3;
                t=0;
                othword(str);
            }
                else i++;
    }
    for(tem=0;tem<j;tem++)
    {
        switch(STR[tem].sign)
        {
        case 1:key(str,Keyword,tem);break;
        case 2:num(str,tem);break;
        case 3:oth(str,Keyword,tem);break;
        default: cout<<"没有您预定的类型!"<<endl;break;
        }
    }
    getchar();//供查看输出结果
}
void kwordanalyse(char str[])//将输入代码分类: 关键字和标识符
{
    STR[j].str[t++]=str[i++];
    if((str[i]>='a'&&str[i]<='z')||(str[i]<'A'&&str[i]>'Z'))
        kwordanalyse(str);
    else j++;
}
void numanalyse(char str[])//代码分类:不同类型的常数
{
    STR[j].str[t++]=str[i++];
    if((str[i]>='0'&&str[i]<='9')||(str[i]=='.'))
        numanalyse(str);
    else j++;
}
void othword(char str[]) //代码分类:其他特殊符号
{
    STR[j].str[t]=str[i];
            if((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')&&(str[i+1]=='='||str[i+1]==str[i]))
                STR[j].str[t+1]=str[i+1];
            else
                j++;
            i++;
}
void key(char str[],char *st[],int tem)   //判断保留字和标志符函数并输出
{
    int t,b(0);
    for(t=0;t<13;t++)
        if(strcmp(STR[tem].str,st[t])==0)
        {
            b=1;
        cout<<"<"<<STR[tem].str<<","<<t+1<<">"<<endl;
        }
        if(!b)
            cout<<"<id,指向"<<STR[tem].str<<"的符号表项的指针,40>"<<endl;
}
void num(char str[],int tem)    //判断整型数并输出
{
    int k1,k2(0);
    for(k1=0;k1<(int)strlen(STR[tem].str);k1++)
    if(STR[tem].str[k1]=='.')
        k2=1;
    if(k2)
        cout<<"<"<<STR[tem].str<<",浮点型常数>"<<endl;
        else
        cout<<"<"<<STR[tem].str<<","<<"整型常数>"<<endl;
}
void oth(char str[],char *st[],int tem) //判断特殊符号
{
    int m,b(0);
    for(m=13;m<39;m++)
        if(strcmp(STR[tem].str,st[m])==0)
    //    {
        //    b=1;
            cout<<"<"<<STR[tem].str<<","<<m+1<<">"<<endl;
    //    }
    //    if(!b)
        //    cout<<"<"<<STR[tem].str<<",此类型未定义>"<<endl;
}       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -