小C語言--詞法分析程序

小C語言--詞法分析程序

Time Limit: 1000 ms Memory Limit: 65535 KiB

Submit Statistic

Problem Description

小C語言文法 
1. <程序>→<main關鍵字>(){<聲明序列><語句序列>}
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

22. < main關鍵字>→main
23. < if關鍵字>→if
24. < else關鍵字>→else
25. < for關鍵字>→for
26. < while關鍵字>→while
27. < 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 panduan(string s)
{
    if(s[0]>='0'&&s[0]<='9') //開頭是數字肯定就爲數字
    {
        cout<<"("<<S[2]<<","<<s<<")"<<endl;
    }
    else
    {
        int f=1;
        for(int i=0; i<6; i++)
        {
            if(s==T[i])
            {
                f=0;
                cout<<"("<<S[0]<<","<<s<<")"<<endl;
                break;
            }
        }
        if(f==1)
        {
            cout<<"("<<S[1]<<","<<s<<")"<<endl;
        }
    }
 
}
int main()
{
 
    string s;
    while(cin>>s)
    {
        int len=s.length();
        string temp="";
        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())
                {
                    panduan(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())
                {
                    panduan(temp);
                }
                temp="";
                cout<<"("<<S[3]<<","<<s[i]<<")"<<endl;
            }
            //不是界符也不是操作符,就存到臨時字符串裏面,等待判斷
            else
            {
                temp=temp+s[i];
 
            }
        }
        if(temp.length())
        {
            panduan(temp);
        }
 
    }
    return 0;
 
}

發佈了58 篇原創文章 · 獲贊 1 · 訪問量 7854
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章