编译原理-词法分析程序1

来源:互联网 发布:会计软件怎么用 编辑:程序博客网 时间:2024/06/05 14:48

0x00 前言

最近在学编译原理,一个简单的词法分析程序。

0x01 题目描述

小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|…|Z21. <数字>→0|1|2|3|4|5|6|7|8|922. < main关键字>→main23. < if关键字>→if24. < else关键字>→else25. < for关键字>→for26. < while关键字>→while27. < int关键字>→int每行单词数不超过10个小C语言文法如上,现在我们对小C语言写的一个源程序进行词法分析,分析出关键字、自定义标识符、整数、界符和运算符。关键字:main if else for while int自定义标识符:除关键字外的标识符整数:无符号整数界符:{ } ( ) , ;运算符:= + - * / < <= > >= == !=Input输入一个小C语言源程序,源程序长度不超过2000个字符,保证输入合法。Output按照源程序中单词出现顺序输出,输出二元组形式的单词串。(单词种类,单词值)单词一共5个种类:关键字:用keyword表示自定义标识符:用identifier表示整数:用integer表示界符:用boundary表示运算符:用operator表示每种单词值用该单词的符号串表示。Example Inputmain() {    int a, b;    if(a == 10)    {        a = b;    }}Example 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,})

0x02 代码

#include<bits/stdc++.h>int iskeyword(char tmp[]){    if(!strcmp(tmp,"main")||!strcmp(tmp,"if")||!strcmp(tmp,"else")||!strcmp(tmp,"for")||!strcmp(tmp,"while")||!strcmp(tmp,"int"))        return 1;    else        return 0;}int islitter(char ch){    if(ch>='a'&&ch<='z')        return 1;    else if (ch>='A'&&ch<='Z')        return 1;    else        return 0;}int isnumber(char ch ){    if(ch >= '0' && ch <= '9')        return 1;    else        return 0;}int isjf(char ch ){    if(ch == '(' || ch == ')' || ch == '{' || ch == '}' || ch == ',' || ch == ';')        return 1;    else        return 0;}int iszf(char ch ){    if(ch == '>' || ch == '<' || ch == '=' || ch == '!' || ch == '+' || ch == '-' || ch == '*' || ch == '/')        return 1;    else        return 0;}int main(){   char ch;   char tmp[100];   int line = 0;   int i = 0;   while(~scanf("%c",&ch))   {       if (ch == ' ' || ch == '\t')        continue;       else if (ch == '\n')        line ++;       else if (islitter(ch) || ch == '_')       {           while(islitter(ch) || isnumber(ch) || ch == '_')           {               tmp[i++] = ch;               scanf("%c",&ch);           }           tmp[i] = '\0';           i = 0;           if(iskeyword(tmp))            printf("(keyword,%s)\n",tmp);           else            printf("(identifier,%s)\n",tmp);           ungetc(ch,stdin);//将字符退回到输入流       }       else if (isnumber(ch))       {           while(isnumber(ch))           {               tmp[i++] = ch;               scanf("%c",&ch);           }           tmp[i] = '\0';           i = 0;           printf("(integer,%s)\n",tmp);           ungetc(ch,stdin);       }      else if (isjf(ch))      {          printf("(boundary,%c)\n",ch);      }      else if (iszf(ch))      {          while(iszf(ch))          {              tmp[i++] = ch;              scanf("%c",&ch);          }          tmp[i] = '\0';          i = 0;          printf("(operator,%s)\n",tmp);          ungetc(ch,stdin);      }   }    return 0;}
原创粉丝点击