1. 程式人生 > >小C語言--詞法分析程式

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

小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

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,})

程式碼:

#include <stdio.h> #include <string.h> #include <ctype.h> #include <iostream> using namespace std; char save[20];/*定義暫存函式*/ char *p; char count[2000]; int total; char sum[6][20]= {"main","if","else","for","while","int"}; /*定義6個關鍵字*/ void alpha()/*分析識別符號*/ {     memset(save,0,20);     int i,j;     char *opp;     i=0;     j=0;/*j=0是識別符號,j=1是關鍵字*/     while(/*isalpha(*p)||*/*p=='_'||isalnum(*p))     {         save[i]=*p;         p++;         i++;     }     opp=save;     for(i=0; i<6; i++) /*把字母與關鍵字表核對,如果是關鍵字就設定j=1*/         if(!(strcmp(opp,sum[i])))/*比較兩個字串*/         {             printf("(keyword,%s)\n",opp); /*識別關鍵字*/             j=1;         }     if(j==0)         printf("(identifier,%s)\n",opp); /*識別識別符號*/     p--; /*回退多讀進的字元*/ } void digit()/*分析數字*/ {     memset(save,0,20);     int i;     i=0;     while(isdigit(*p))/*檢查是否數字(0-9)*/     {         save[i]=*p;         i++;         p++;     }     printf("(integer,%s)\n",save);     p--; } int main() {

    memset(count,0,2000);/*把count所指記憶體區域的前200個位元組設定成字元0*/     while(gets(count))     {         p=count;         while(*p!='\0')/*檢查源程式是否結束*/         {             memset(save,0,20);             while(*p==' '||*p=='\n'||*p=='\t')                 p++;/*檢查是否是空白字元,如果是直接跳過*/             if(isalpha(*p)||*p=='_')                 alpha();/*識別關鍵字或識別符號*/             else if(*p==';'||*p==','||*p=='{'||*p=='}'||*p=='('||*p==')')                 printf("(boundary,%c)\n",*p);             else if(*p=='+'||*p=='-'||*p=='*'||*p=='/')                 printf("(operator,%c)\n",*p);             else if(*p=='<'||*p=='>'||*p=='='||*p=='!')             {                 if(*(p+1)=='=')                 {                     printf("(operator,%c=)\n",*p);                     p++;                 }                 else                     printf("(operator,%c)\n",*p);             }             else if(isdigit(*p))/*識別整數*/                 digit();             p++; /*準備識別下一個單詞*/         }     }     return 0; }