zoukankan      html  css  js  c++  java
  • 词法分析器 /c++实现

    #include<iostream>
    #include<string>
    #include<vector>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    int line=1,row=1;
    char c;
    map<char,int>ma;
    struct  kind
    {
        string na;    //单词
        int num;     //内码
        string type;  //类型
        int l,r;    //行列数
    };
    vector<kind>res;  //视图表
    int tree[10000][30];int numv=0;int w[10000];
    int key=0;  int flag=0;
    void insert(string s)   //关键词trie树
    {
        int u=0;
        for(int i=0;i<s.size();i++)
        {
            if(tree[u][s[i]-'a']==0)
               tree[u][s[i]-'a']=++numv;
            u=tree[u][s[i]-'a'];
        }
        w[u]=key++;
    }
    void f1(char &c)  //  关键字标识符分析器
    {
        int mark=1;
        string s;
        s+=c;
        int u=0;
        if(tree[u][c-'a']!=0)
           u=tree[u][c-'a'];
        else mark=0;
        while(c=getchar())
        {
            if(!(c>='a'&&c<='z'))
              if(c!='_')
                if(!(c>='0'&&c<='9'))
                  break;
            if(mark==1)
            {
                 if(tree[u][c-'a']!=0)
                   u=tree[u][c-'a'];
                  else mark=0;
            }
            s+=c;
        }
        kind t;
        t.na=s;
        t.l=line;
        t.r=row;
        if(mark==0)
        {
            t.num=flag++;
            t.type="     标志符";
        }
        else
        {
            t.num=w[u];
            t.type="     关键字";
        }
        res.push_back(t);
        return ;
    }
    void f2(char &c)         //数字分析器
    {
        string s;
        s+=c;
        c=getchar();
        while(c>='0'&&c<='9')
        {
            s+=c;
            c=getchar();
        }
        int mark=1;
        while(c>='a'&&c<='z')
          {s+=c;mark=0;c=getchar();}
        kind t;
        t.na=s;
        t.l=line;
        t.r=row;
        if(mark==1)
        {
            char *p;
        strcpy(p,s.c_str());
        t.num=atoi(p);
        t.type="    数字";
        }
        else
        {
            t.type="    error";
            t.num=0;
        }
        res.push_back(t);
        return ;
    }
    void f3(char &c)         //分界符、运算符等其他分析器
    {
        string s;
        kind t;
        t.l=line;t.r=row;
        if(ma.find(c)!=ma.end())
        {
            t.na+=c;
            if(ma[c]<=8)t.type="     分界符";
            else t.type="     运算符";
            t.num=ma[c];
            c=getchar();
        }
        else
        {
            t.type="   关系运算符";
            if(c=='>')
            {
                 c=getchar();
                 if(c=='=')
                 {
                     t.na=">=";
                     t.num=1;
                     c=getchar();
                 }
                 else
                 {
                    t.na=">";
                    t.num=2;
                 }
            }
           else if(c=='<')
            {
                  c=getchar();
                  if(c=='=')
                  {
                    t.na="<=";
                     t.num=3;
                     c=getchar();
                  }
                  else if(c=='>')
                  {
                      t.na="<>";
                      t.num=4;
                      c=getchar();
                  }
                  else
                  {
                      t.na="<";
                      t.num=5;
                  }
            }
            else if(c=='=')
            {
                t.na="=";
                t.num=6;
                c=getchar();
            }
        }
        res.push_back(t);
        return ;
    }
    int main()           //总控程序
    {
       ma['[']=1;ma[']']=2;ma[',']=3;ma[';']=4;ma['(']=5;ma[')']=6;ma['{']=7;ma['}']=8;
       ma['+']=9;ma['-']=10;ma['*']=11;ma['/']=12;ma['%']=13;
       string s;
       while(s!="end")
       {
           cin>>s;
           insert(s);
       }
       getchar();
       cout<<"请输入语句:"<<endl;
        c=getchar();
        while(1)
        {
            if(c=='@')break;
            while(c==' '){c=getchar();row++;}
            if(c>='a'&&c<='z')
               f1(c);
            else if(c>='0'&&c<='9')
               f2(c);
            else
               f3(c);
            row++;
            if(c=='
    ')
              {
                  line++;
                  row=1;
                  c=getchar();
              }
        }
        cout<<"单词"<<'	'<<'	'<<"二元序列"<<'	'<<'	'<<"类型"<<'	'<<'	'<<"位置(行,列)"<<endl;
        for(int i=0;i<res.size();i++)
          {
              cout<<res[i].na<<'	'<<'	'<<"("<<res[i].num<<","<<res[i].na<<")"<<'	'<<'	'<<res[i].type<<'	'<<'	'<<"("<<res[i].l<<","<<res[i].r<<")"<<endl;
          }
    
    }
    
    
    



    测试:

    if while int char else then do 
    end
    int a=10;
    int b=11;
    int s=0;
    if(a>=10)
    {
        s=a+b%2;
    }
    else
    {
       s=a-b*a/11;
    }
    int 3b;
    @    

  • 相关阅读:
    URL 转化为 Dictionary 字典
    ios 续费 问题 冰山一角
    1.node.js在遇到“循环+异步”时的注意事项
    1.【微信小程序经验】各类图表相关组件+Demo源码(折线图,柱状图,K线,分时图)
    10. 启动WPS for Linux后,出现提示"系统缺失字体"
    8.Postman中发送请求被拦截(证书问题)
    20.mysql查看sql执行时间
    19.Mysql索引结构及常见索引的区别
    18.mysql优化(三)–explain分析sql语句执行效率
    9.安装的第一个Linux系统 -Linux Mint 18.1 cinnamon
  • 原文地址:https://www.cnblogs.com/yezekun/p/3925710.html
Copyright © 2011-2022 走看看