编译原理实验 词法分析器的设计

  • 实验目的

  设计词法分析器

  • 设计方法
  1. 写出该语言的词法规则。
  2. 把词法规则转换为相应的状态转换图。
  3. 把各转换图的初态连在一起,构成识别该语言的自动机
  4. 设计扫描器
  5. 把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。
  6. 扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。
  7. 实验代码:
    #include<bits/stdc++.h>
    #define KEYWORD         1
    #define BORDER          2
    #define OPERATOR        3
    #define IDENTIFIER      4
    #define CONSTINTEGRAL   5
    #define ELSE            0
    using namespace std;
    
    
    string keyWord[] = { "void", "int", "char", "main", "return", "if", "else"};
    string border[] = { "(", ")", "[", "]", "{", "}", ";", "," };
    string operator0[] = { "+", "-", "*", "/", "%", "=" };
    
    
    
    bool Letter(char c)
    {
        if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z')
        {
            return true;
        }
        return false;
    }
    
    
    bool KeyWord(string str)
    {
        for (int i=0;i<7;i++)
        {
            string s = keyWord[i];
            if (s == str)
                return true;
        }
        return false;
    }
    
    
    bool Border(string str)
    {
        for (int i=0;i<8;i++)
        {
            string s = border[i];
            if (s == str)
                return true;
        }
        return false;
    }
    
    
    bool Operator(string str)
    {
        for (int i=0;i<6;i++)
        {
            string s = operator0[i];
            if (s == str)
                return true;
        }
        return false;
    }
    
    
    bool Digit(char c)
    {
        if (c >= '0' && c <= '9')
        {
            return true;
        }
        return false;
    }
    
    int Code(string str)
    {
        int type = ELSE;
    
        if (KeyWord(str))
            type = KEYWORD;
    
        else if (Border(str))
            type = BORDER;
    
        else if (Operator(str))
            type = OPERATOR;
    
        else if (Digit(str[0]))
            type = CONSTINTEGRAL;
    
        // 标识符
        else if (str[0] == '_' || Letter(str[0]))
        {
            type = IDENTIFIER;
            {
                for (int i = 1; i < str.length(); i++)
                {
                    // 若不符合标识符规则,则type=0
                    if (!(str[i] == '_' || Letter(str[i]) || Digit(str[i])))
                    {
                        type = ELSE;
                        break;
                    }
                }
            }
        }
        else
            type = ELSE;
    
        return type;
    }
    
    int main()
    {
        string token="";
        cout << "请输入测试代码,以#结尾" << endl;
        char  ch='*';
        do{
            ch=getchar();
            if(ch==' '||ch=='\n')
                continue;
            token=token+ch;
        }while(ch!='#');
       token.erase(token.end() - 1);
    
        cout << "token = " << token << endl;
    
        string str = "";
        int i = 0;
        while(i < token.length())
        {
            str = "";
            // 数字开头
            if (Digit(token[i]))
            {
                while (Digit(token[i]))
                    str = str + token[i++];
                cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl;
            }
            // 下划线或者字母开头的单词,即标识符或者关键字
            else if (token[i] == '_' || Letter(token[i]))
            {
                while (token[i] == '_' || Letter(token[i]) || Digit(token[i]))
                {
                    str = str + token[i++];
                    // 如果是关键字,立即结束
                    if (Code(str) == KEYWORD)
                        break;
                }
                cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl;
            }
            // 运算符
            else {
                str = str + token[i++];
                cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl;
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值