实验报告一:词法分析

实验一、词法分析实验

专业:商业软件工程   姓名:覃伟业  学号;201506110233

一、 实验目的

编写一个关于词法分析的程序,

 

 

 

二、 实验内容和要求

要求:

-输入:源程序字符串

-输出:二元组(种别,单词符号本身)

 

三、 实验方法、步骤及结果测试

 

  1. 源程序名:压缩包文件(rarzip)中源程序名 词法分析.c

可执行程序名:词法分析.exe

  1. 原理分析及流程图

#include <stdio.h>

  2 #include <string.h>

  3

  4 char wsym[100],token[8],ch;

  5 int syn,word,i,j,sum;

  6 char *keyword[6]={"begin","if","then","while","do","end"};

  7

  8 void scaner(void);

  9

 10 main()

 11 {

 12     word=0;

 13     printf("\n 在下方输入你的字符串(按回车结束输入):\n");

 14

 15     do{

 16             scanf("%c",&ch);

 17             wsym[word++]=ch;

 18     }while(ch!='\n');

 19

 20     word=0;

 21     do{

 22             scaner();

 23             switch(syn)

 24             {

 25                 case 11:

 26                     printf("( %-10d%5d )\n",sum,syn);

 27                 break;

 28

 29                 case -1:

 30                     printf("you have input a wrong string\n");

 31                     return 0;

 32                 break;

 33

 34                 default:

 35                 printf("( %-10s%5d )\n",token,syn);

 36                 break;

 37             }

 38         }while(syn!=0);

 39

 40  }

 41

 42 void scaner(void)

 43 {

 44     sum=0;

 45

 46     for(i=0;i<8;i++)

 47         token[i++]= NULL;

 48

 49         ch=wsym[word++];

 50         i=0;

 51

 52     while((ch==' ')||(ch=='\n'))

 53         ch=wsym[word++];

 54

 55     if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

 56      {

 57         while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

 58         {

 59             token[i++]=ch;

 60             ch=wsym[word++];

 61         }

 62

 63         word--;

 64         syn=10;

 65

 66         for(j=0;j<6;j++)

 67         if(strcmp(token,keyword[n])==0)

 68         {

 69             syn=j+1;

 70             break;

 71         }

 72      }

 73      else if((ch>='0')&&(ch<='9'))

 74      {

 75         while((ch>='0')&&(ch<='9'))

 76         {

 77             sum=sum*10+ch-'0';

 78             ch=wsym[word++];

 79         }

 80         word--;

 81         syn=11;

 82     }

 83     else

 84     {

 85         switch(ch)

 86         {

 87         case '<':

 88             token[i++]=ch;

 89             ch=wsym[word++];

 90             if(ch=='=')

 91             {

 92                 syn=21;

 93                 token[i++]=ch;

 94             }

 95             else

 96             {

 97                 syn=20;

 98                 word--;

 99             }

100         break;

101

102         case '>':

103             token[i++]=ch;

104             ch=wsym[word++];

105             if(ch=='=')

106             {

107                 syn=24;

108                 token[i++]=ch;

109             }

110             else

111             {

112                 syn=23;

113                 word--;

114             }

115         break;

116

117         case '+':

118             syn=13;

119             token[i++]=ch;

120         break;

121

122         case '-':

123             syn=14;

124             token[i++]=ch;

125         break;

126

127         case '=':

128             syn=25;

129             token[i++]=ch;

130         break;

131

132         case '*':

133             syn=15;

134             token[i++]=ch;

135         break;

136

137         case '/':

138             syn=16;

139             token[i++]=ch;

140         break;

141

142         case '(':

143             syn=27;

144             token[i++]=ch;

145         break;

146

147         case ')':

148             syn=28;

149             token[i++]=ch;

150         break;

151

152         case '<>':

153             syn=22;

154             token[i++]=ch;

155         break;

156

157         case ';':

158             syn=26;

159             token[i++]=ch;

160         break;

161

162         case '#':

163             syn=0;

164             token[i++]=ch;

165         break;

166

167         case ':':

168             token[i++]=ch;

169             ch=wsym[word++];

170             if(ch=='=')

171             {

172                 syn=18;

173                 token[i++]=ch;

174             }

175             else

176             {

177             syn=17;

178             token[i++]=ch;

179             }

180         break;

181

182         default:

183             syn=-1;

184         break;

185         }

186     }

187         token[i++]='\0';

188 }

  1. 主要程序段及其解释:

66-188

解释:识别标识符,给标识符赋值(就是书本中的标识符所代表的数值),

 

  1. 运行结果及分析

 

 

 

简单的识别标识符

 

 

 

四、 实验总结

 

我觉得还是比较难理解的,还是不太会,更多的要去问舍友

 

posted @ 2016-10-14 20:18  233覃伟业  阅读(211)  评论(4编辑  收藏  举报