当前位置:   article > 正文

用C语言实现简单的词法分析器_简单词法分析器c语言

简单词法分析器c语言

词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。


要实现的词法分析器单词符号及种别码对照表:

单词符号#beginifthenwhiledoEnd+-*/:: =
种别码0123456131415161718

单词符号<<><=>>==;()Letter(letter|digit)digit digit*
种别码2021222324252627281011


  1. #include<stdio.h>
  2. #include<string.h>
  3. char input[200];//存放输入字符串
  4. char token[5];//存放构成单词符号的字符串
  5. char ch; //存放当前读入字符
  6. int p; //input[]下标
  7. int fg; //switch标记
  8. int num; //存放整形值
  9. //二维字符数组,存放关键字
  10. char index[6][6]={"begin","if","then","while","do","end"};
  11. main()
  12. {
  13. p=0;
  14. printf("please intput string(End with '#'):\n");
  15. do
  16. {
  17. ch=getchar();
  18. input[p++]=ch;
  19. }while(ch!='#');
  20. p=0;
  21. do
  22. {
  23. scaner();
  24. switch(fg)
  25. {
  26. case 11:printf("( %d,%d ) ",fg,num);break;
  27. case -1:printf("input error\n"); break;
  28. default:printf("( %d,%s ) ",fg,token);
  29. }
  30. }while(fg!=0);
  31. getch(); //用于让程序停留在显示页面
  32. }
  33. /*词法扫描程序:*/
  34. scaner()
  35. {
  36. int m=0;//token[]下标
  37. int n;
  38. //清空token[]
  39. for(n=0;n<5;n++)
  40. token[n]=NULL;
  41. //获取第一个不为0字符
  42. ch=input[p++];
  43. while(ch==' ')ch=input[p++];
  44. //关键字(标识符)处理流程
  45. if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
  46. {
  47. while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
  48. {
  49. token[m++]=ch;
  50. ch=input[p++];
  51. }
  52. token[m++]='\0';
  53. ch=input[--p];
  54. fg=10;
  55. for(n=0;n<6;n++)
  56. if(strcmp(token,index[n])==0)//strcmp()比较两个字符串,相等返回0
  57. {
  58. fg=n+1;
  59. break;
  60. }
  61. }
  62. //数字处理流程
  63. else if((ch<='9'&&ch>='0'))
  64. {
  65. num=0;
  66. while((ch<='9'&&ch>='0'))
  67. {
  68. num=num*10+ch-'0';
  69. ch=input[p++];
  70. }
  71. ch=input[--p];
  72. fg=11;
  73. }
  74. //运算符界符处理流程
  75. else
  76. switch(ch)
  77. {
  78. case '<':
  79. m=0;
  80. token[m++]=ch;
  81. ch=input[p++];
  82. if(ch=='>') //产生<>
  83. {
  84. fg=21;
  85. token[m++]=ch;
  86. }
  87. else if(ch=='=') //产生<=
  88. {
  89. fg=22;
  90. token[m++]=ch;
  91. }
  92. else
  93. {
  94. fg=20;
  95. ch=input[--p];
  96. }
  97. break;
  98. case '>':
  99. token[m++]=ch;
  100. ch=input[p++];
  101. if(ch=='=') //产生>=
  102. {
  103. fg=24;
  104. token[m++]=ch;
  105. }
  106. else //产生>
  107. {
  108. fg=23;
  109. ch=input[--p];
  110. }
  111. break;
  112. case ':':
  113. token[m++]=ch;
  114. ch=input[p++];
  115. if(ch=='=') //产生:=
  116. {
  117. fg=18;
  118. token[m++]=ch;
  119. }
  120. else //产生:
  121. {
  122. fg=17;
  123. ch=input[--p];
  124. }
  125. break;
  126. case '+':fg=13;token[0]=ch;break;
  127. case '-':fg=14;token[0]=ch;break;
  128. case '*':fg=15;token[0]=ch;break;
  129. case '/':fg=16;token[0]=ch;break;
  130. case ':=':fg=18;token[0]=ch;break;
  131. case '<>':fg=21;token[0]=ch;break;
  132. case '<=':fg=22;token[0]=ch;break;
  133. case '>=':fg=24;token[0]=ch;break;
  134. case '=':fg=25;token[0]=ch;break;
  135. case ';':fg=26;token[0]=ch;break;
  136. case '(':fg=27;token[0]=ch;break;
  137. case ')':fg=28;token[0]=ch;break;
  138. case '#':fg=0;token[0]=ch;break;
  139. default:fg=-1;
  140. }
  141. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/294258
推荐阅读
相关标签
  

闽ICP备14008679号