zoukankan      html  css  js  c++  java
  • 小C语言–词法分析程序

    小C语言–词法分析程序
    Time Limit: 1000 ms Memory Limit: 5000 KiB

    Problem Description
    小C语言文法
    1. <程序>→(){<声明序列><语句序列>}
    2. <声明序列>→<声明序列><声明语句>|<声明语句>|<空>
    3. <声明语句>→<标识符表>;
    4. <标识符表>→<标识符>,<标识符表>|<标识符>
    5. <语句序列>→<语句序列><语句>|<语句>
    6. <语句>→< if语句>|< while语句>|< for语句>|<复合语句>|<赋值语句>
    7. < if语句>→< if关键字>(<表达式>)<复合语句>|(<表达式>)<复合语句>< else关键字><复合语句>
    8. < while语句>→< while关键字>(<表达式>)<复合语句>
    9. < for语句>→< for关键字>(<表达式>;<表达式>;<表达式>)<复合语句>
    10. <复合语句>→{<语句序列>}
    11. <赋值语句>→<表达式>;
    12. <表达式>→<标识符>=<算数表达式>|<布尔表达式>
    13. <布尔表达式>→<算数表达式> |<算数表达式><关系运算符><算数表达式>
    14. <关系运算符>→>|<|>=|<=|==|!=
    15. <算数表达式>→<算数表达式>+<项>|<算数表达式>-<项>|<项>
    16. <项>→<项>*<因子>|<项>/<因子>|<因子>
    17. <因子>→<标识符>|<无符号整数>|(<算数表达式>)
    18. <标识符>→<字母>|<标识符><字母>|<标识符><数字>
    19. <无符号整数>→<数字>|<无符号整数><数字>
    20. <字母>→a|b|…|z|A|B|…|Z
    21. <数字>→0|1|2|3|4|5|6|7|8|9

    1. < main关键字>→main
    2. < if关键字>→if
    3. < else关键字>→else
    4. < for关键字>→for
    5. < while关键字>→while
    6. < int关键字>→int

    每行单词数不超过10个
    小C语言文法如上,现在我们对小C语言写的一个源程序进行词法分析,分析出关键字、自定义标识符、整数、界符
    和运算符。
    关键字:main if else for while int
    自定义标识符:除关键字外的标识符
    整数:无符号整数
    界符:{ } ( ) , ;
    运算符:= + - * / < <= > >= == !=

    Input
    输入一个小C语言源程序,源程序长度不超过2000个字符,保证输入合法。

    Output
    按照源程序中单词出现顺序输出,输出二元组形式的单词串。

    (单词种类,单词值)

    单词一共5个种类:

    关键字:用keyword表示
    自定义标识符:用identifier表示
    整数:用integer表示
    界符:用boundary表示
    运算符:用operator表示

    每种单词值用该单词的符号串表示。

    Sample Input
    main()
    {
    int a, b;
    if(a == 10)
    {
    a = b;
    }
    }
    Sample Output
    (keyword,main)
    (boundary,()
    (boundary,))
    (boundary,{)
    (keyword,int)
    (identifier,a)
    (boundary,,)
    (identifier,b)
    (boundary,;)
    (keyword,if)
    (boundary,()
    (identifier,a)
    (operator,==)
    (integer,10)
    (boundary,))
    (boundary,{)
    (identifier,a)
    (operator,=)
    (identifier,b)
    (boundary,;)
    (boundary,})
    (boundary,})
    Hint
    Source
    cai++

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string S[5]={"keyword","identifier","integer","boundary","operator"};
    string T[6]={"main","if","else","for","while","int"};
    
    void f(string s){//判断是否是标识符,整数还是关键字
        if(s[0] >= '0' && s[0] <= '9'){//开头是数字的话,肯定是整数
            cout<<"("<<S[2]<<","<<s<<")"<<endl;
        }
        else{//开头不是数字的话,就是标识符或者关键字
            int flag=0;//检查是否是关键字的标志
            for(int i=0;i<6;i++){//循环检查是不是关键字
                if(s==T[i]){
                    flag=1;
                    cout<<"("<<S[0]<<","<<s<<")"<<endl;
                    break;
                }
            }
            if (!flag){//如果不是关键字就是标识符
                cout<<"("<<S[1]<<","<<s<<")"<<endl;
            }
        }
    }
    
    int main(){
        string s;
        while(cin>>s){
            string temp="";
            int len=s.length();
            for (int i=0;i<len;i++){
                //判断是否是操作符
                if(s[i] == '=' || s[i] == '+' || s[i] == '-'||s[i] == '*'|| s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!'){
                    if(temp.length()){//先前存留的进行判断
                        f(temp);
                    }
                    temp="";//清空
                    if(i+1<len&&s[i+1] == '='){//如果是<=,>=,==
                        cout<<"("<<S[4]<<","<<s[i]<<s[i+1]<<")"<<endl;
                        i++;
                    }
                    else{//普通运算符
                        cout<<"("<<S[4]<<","<<s[i]<<")"<<endl;
                    }
                }
                //判读是否是界符
                else if(s[i] == '(' || s[i] == ')' || s[i] == '{'||s[i] == '}'|| s[i] == ',' || s[i] ==';'){
                    if(temp.length()){//先前残留的进行判断
                        f(temp);
                    }
                    temp="";//清空
                    cout<<"("<<S[3]<<","<<s[i]<<")"<<endl;
                }
                else{//不是界符也不是操作符,就存到临时字符串里面,等待判断
                    temp=temp+s[i];
                }
            }
            if(temp.length()){//最后的残留的进行判断
                f(temp);
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    actionscript项目中自加载preloader实现
    as3 弹性跑道模型
    快速排序
    快捷键
    frameset和iframe--框架对象及元素标签对象
    Javascript的陷阱
    JS火狐与IE的差别
    JS运动框架
    面向对象与闭包的使用
    闭包
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781738.html
Copyright © 2011-2022 走看看