• 编译原理词法分析程序


    #include <iostream>
    #include<string>
    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    using namespace std;
    #define  MAX 22
    char ch =' ';
    string key[15]={"switch","break","if","then","else","while","write","read",
    "do", "int","const","char","float","double","for"};
    
    int Iskey(string c)    //关键字判断
    {
       int i;
       for(i=0;i<MAX;i++)
        {
          if(key[i].compare(c)==true)
            return 1;
        }
        return 0;
    }
    int IsLetter(char c)   //判断是否为字母
    {
        if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
            return 1;
        else
            return 0;
    }
    int IsDigit(char c)    //判断是否为数字
    {
         if(c>='0'&&c<='9')
            return 1;
         else
            return 0;
    }
    void analyse(FILE *fpin)  //词法分析程序
    {
        string arr="";
        while((ch=fgetc(fpin))!=EOF)
        {
            arr="";
            if(ch==' '||ch=='	'||ch=='
    ')
            {
            }
            else if(IsLetter(ch))
            {
                while(IsLetter(ch)||IsDigit(ch))
                {
                    if((ch<='Z')&&(ch>='A'))
                        ch=ch+32;
                    arr=arr+ch;
                    ch=fgetc(fpin);
                }
                fseek(fpin,-1L,SEEK_CUR);
                if (Iskey(arr))
                {
                    cout<<arr<<"	$关键字"<<endl;
                }
                else  cout<<arr<<"	$普通标识符"<<endl;
            }
    
            else if(IsDigit(ch))
            {
                while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin))))
                {
                    arr=arr+ch;
                    ch=fgetc(fpin);
                }
                fseek(fpin,-1L,SEEK_CUR);
                cout<<arr<<"	$无符号实数"<<endl;
            }
           else switch(ch)
            {
               case'+':
               case'-' :
               case'*' :
               case'=' :
               case'/' :cout<<ch<<"	$运算符"<<endl;break;
               case'(' :
               case')' :
               case'[' :
               case']' :
               case';' :
               case'.' :
               case',' :
               case'{' :
               case'}' :cout<<ch<<"	$界符"<<endl;break;
               case':' :
                {ch=fgetc(fpin);
                if(ch=='=')
                    cout<<":="<<"	$运算符"<<endl;
                else
                {
                    cout<<"="<<"	$运算符"<<endl;;
                    fseek(fpin,-1L,SEEK_CUR);
                }
                }break;
                case'>' :{ch=fgetc(fpin);
                             if(ch=='=') cout<<">="<<"	$运算符"<<endl;
                             if(ch=='>')cout<<">>"<<"	$输入控制符"<<endl;
                             else {cout<<">"<<"	$运算符"<<endl;
                                 fseek(fpin,-1L,SEEK_CUR);}
                             }break;
                case'<' :{ch=fgetc(fpin);
                             if(ch=='=')cout<<"<="<<"	$运算符"<<endl;
                             else if(ch=='<')cout<<"<<"<<"	$输出控制符"<<endl;
                             else if(ch=='>') cout<<"<>"<<"	$运算符"<<endl;
                             else{cout<<"<"<<"	$运算符"<<endl;
                                fseek(fpin,-1L,SEEK_CUR);}
                            }break;
                default : cout<<ch<<"	$无法识别字符"<<endl;
            }
        }
    }
    int main()
    {
       char in_fn[30];
       FILE * fpin;
       cout<<"请输入源文件名(包括路径和后缀名):";
       for(;;)
        {
           cin>>in_fn;
           if((fpin=fopen(in_fn,"r"))!=NULL)
                break;
           else
            cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
        }
       cout<<"
    ********************分析如下*********************"<<endl;
       analyse(fpin);
       fclose(fpin);
    
       return 0;
    }

    请dalao不吝赐教。
  • 相关阅读:
    Codeforces467C George and Job
    Codeforces205E Little Elephant and Furik and RubikLittle Elephant and Furik and Rubik
    Codeforce205C Little Elephant and Interval
    51nod1829 函数
    51nod1574 排列转换
    nowcoder35B 小AA的数列
    Codeforce893E Counting Arrays
    gym101612 Consonant Fencity
    CodeForces559C Gerald and Giant Chess
    CodeForces456D A Lot of Games
  • 原文地址:https://www.cnblogs.com/liesun/p/7350340.html
Copyright © 2020-2023  润新知