• 【编译原理】机测笔记


    A - 小C语言–词法分析程序

    < 参考代码 >

    #include "iostream"
    using namespace std;
    // 定义6个关键词
    string S[6] = {"main", "for", "if", "else", "int", "while"};
    
    // Todo: 设置display 函数用于输出关键词、整数、自定义字符
    void display(string s){
        //如果传入的字串第一个字符是数字,那肯定剩下的全部是数字,所以判断头一个即可
        if(s[0] >= '0' && s[0] <= '9')
            cout<<"(integer,"<<s<<")"<<endl;
        else{
            // 定义一个flag参数用于判断是否找到关键字
            int flag = 1;
            for(int i = 0; i < 6; i++){
                // 找到关键字并输出,记得将flag变为0
                if(s == S[i]){
                    flag = 0;
                    cout<<"(keyword,"<<s<<")"<<endl;
                }
            }
            //如果既不是数字又不是关键字,那么肯定是自定义字符
            if(flag == 1)
                cout<<"(identifier,"<<s<<")"<<endl;
        }
    }
    //要知道display函数是在判断完不是界符和标识符的基础上判断剩下的三种符号的。
    
    // Todo: 主函数
    int main(){
        string s;
        while(cin>>s){
            // 调用length函数保存输入字符长度
            int len = s.length();
            // 定义字串a并初始化为空字符
            string a = "";
            for(int i = 0; i < len; i++){
                if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!'){
                    // 如果a不为空,则进入display函数进行判断是那种词法
                    if(a.length())
                        display(a);
                    a = "";
                    // 此处是判断>= <= !=的情况
                    if(i + 1 < len && s[i + 1] == '='){
                        cout<<"(operator,"<<s[i]<<s[i + 1]<<")"<<endl;
                        i++;    // 记得将i+1,不然下次循环会重复判断
                    }
                    else
                        cout<<"(operator,"<<s[i]<<")"<<endl;
    
                }
                else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';'){
                    if(a.length())
                        display(a);//同上
                    a = "";
                    cout<<"(boundary,"<<s[i]<<")"<<endl;
                }
                else
                    a = a + s[i];
            }
            // 此处是为了避免a中还存留输入的字符没进行判断,所以最后再调用一次display函数进行清空操作
            if(a.length())
                display(a);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    < 代码思路 >

    int main()

    • 调用length函数保存输入字符长度
    • 定义字串a并初始化为空字符
    • 判断是不是界符和标识符 → 判断剩下的三种符号
      • 如果a不为空,则进入display()函数进行判断是那种词法
      • 此处是判断>= <= !=的情况(记得将i+1,不然下次循环会重复判断)
      • 此处是判断 ( ) { } 的情况
    • 避免a中还存留输入的字符没进行判断,所以最后再调用一次display函数进行清空操作

    void display( string s)

    • 如果传入的字串第一个字符是数字,那肯定剩下的全部是数字,所以判断头一个即可
    • 定义一个flag参数用于判断是否找到关键字,找到关键字并输出,记得将flag变为0
    • 如果既不是数字又不是关键字,那么肯定是自定义字符

    D - 表达式语法分析——递归子程序法

    < 参考代码 >

    #include
    #include
    #include
    
    int i=0,c=0;
    char s[65];
    void E();
    void T();
    void G();
    void S();
    void F();
    
    void E(){
        if(s[i]=='('||s[i]=='i'){
            printf("%d E-->TG\n",c++);
            T();
            G();
        } else{
            printf("error\n");
            exit(0);
        }
    }
    
    void T(){
        if(s[i]=='('||s[i]=='i'){
            printf("%d T-->FS\n",c++);
            F();
            S();
        } else{
            printf("error\n");
            exit(0);
        }
    }
    void G(){
        if(s[i]=='+'){
            printf("%d G-->+TG\n",c++);
            i++;
            T();
            G();
        } else
            printf("%d G-->&\n",c++);
    }
    
    void S(){
        if(s[i]=='*'){
            printf("%d S-->*FS\n",c++);
            i++;
            F();
            S();
        } else
            printf("%d S-->&\n",c++);
    }
    
    void F(){
        if(s[i]=='i'){
            printf("%d F-->i\n",c++);
            i++;
        }
        else if(s[i]=='('){
            printf("%d F-->(E)\n",c++);
            i++;
            E();
            if(s[i]==')')
                i++;
            else{
                printf("error\n");
                exit(0);
            }
        } else{
            printf("error\n");
            exit(0);
        }
    }
    
    int main(){
        scanf("%s",s);
        E();
        if(s[i]!='#')
            printf("error\n");
        else
            printf("accept\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    < 代码思路 >

  • 相关阅读:
    PHP接口自动化测试框架实现
    打破JSON的束缚:探寻Spring @JsonComponent的灵活性和扩展性
    Allegro如何使用快捷键快速切换走线线宽操作指导
    TMS320F28374S之DAC
    词法、语法、语义分析编译原理设计
    spring底层原理初探
    Jedis操作Redis
    R语言使用dplyr包右连接两个dataframe数据(right join)
    新能源汽车整车测试解决方案-热管理测试
    研究生如何选择适合自己的导师
  • 原文地址:https://blog.csdn.net/Lenhart001/article/details/132865550