一、实验目的:
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容:
1.要识别的词素:
(1)保留字或关键字:如:BEGIN、 END、VAR、INTEGER、REAL、 IF、 THEN、READ、WRITE、WHILE。
(2)运算符: 如:+、-、*、/、:=、=、>、<、>=、<=
(3)标识符: 用户定义的变量名、常数名、过程名
(4)常数: 如:10、25、100、2.3等整数或实数
(5)界符: 如:‘,’、‘.’ 、‘;’ 、‘(’ 、‘)’、‘{’、‘}’,‘:’
2.词法分析过程所要完成的任务:
(1)从源程序读字符(getch)
(2)滤空格
(3)识别保留字
(4)识别标识符
(5)拼数
(6)拼复合词(如:=)
(7)输出源程序的token(词法单元)序列。
三、实验要求:
四、实验步骤:
1.先画出识别不同词素的自动机,再将其组合成一个大的自动机;
2.画出词法分析程序的工作流程图,编写程序。
五、我的代码
运行结果如下
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容:
1.要识别的词素:
(1)保留字或关键字:如:BEGIN、 END、VAR、INTEGER、REAL、 IF、 THEN、READ、WRITE、WHILE。
(2)运算符: 如:+、-、*、/、:=、=、>、<、>=、<=
(3)标识符: 用户定义的变量名、常数名、过程名
(4)常数: 如:10、25、100、2.3等整数或实数
(5)界符: 如:‘,’、‘.’ 、‘;’ 、‘(’ 、‘)’、‘{’、‘}’,‘:’
2.词法分析过程所要完成的任务:
(1)从源程序读字符(getch)
(2)滤空格
(3)识别保留字
(4)识别标识符
(5)拼数
(6)拼复合词(如:=)
(7)输出源程序的token(词法单元)序列。
三、实验要求:
- 对单词的构词规则有明确的定义;
- 编写的分析程序能够正确识别源程序中的单词符号;
- 识别出的单词以<类别码,值>的形式保存并输出;
- 实验报告要求用自动机对词法定义做出详细说明,并给出词法分析程序的工作流程图。
四、实验步骤:
1.先画出识别不同词素的自动机,再将其组合成一个大的自动机;
2.画出词法分析程序的工作流程图,编写程序。
- 依次读入源程序符号,对源程序进行词素识别,直到源程序结束;
- 对正确的单词,按照它的种别以<类别码,值>的形式输出;
五、我的代码
- #include <stdio.h>
- #include <string.h>
- char str[80],token[8];
- char ch;
- int syn,p,m=0,n,sum=0;
- double small = 0;
- char *tab[10] = {"begin","end","var","integer","real","if","then","read","write","while"};
- /**
- *整数 1
- *小数 2
- *字符串 3
- * begin 10 end 11 var 12 integer 13 real 14
- * if 15 then 16 read 17 write 18 while 19
- * + 20 - 21 * 22 / 23 := 24 = 25
- * > 26 < 27 >= 28 <= 29
- * , 30 . 31 ; 32 ( 33 ) 34
- * { 35 } 36 : 37
- */
- void scaner() {
- for(n=0; n<8; n++) token[n]=NULL;
- ch=str[p++];
- while(ch==' ') {
- ch=str[p];
- p++;
- }
- //关键字和变量名识别
- if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
- m=0;
- while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
- token[m++]=ch;
- ch=str[p++];
- }
- token[m++]='\0';
- p--;
- syn=3;
- for(n=0; n<10; n++)
- if(strcmp(token,tab[n])==0) {
- syn=10+n;
- break;
- }
- } else if((ch>='0'&&ch<='9')) { //整数和小数识别
- sum=0;
- while((ch>='0'&&ch<='9') || ch=='.') {
- if(ch=='.') {
- ch=str[p++];
- double rate = 0.1;
- small = sum;
- while((ch>='0'&&ch<='9')) {
- small = small + (ch-'0')*rate;
- rate = rate*0.1;
- ch=str[p++];
- }
- p--;
- syn=2;
- break;
- }
- sum=sum*10+ch-'0';
- ch=str[p++];
- }
- if(syn!=2) {
- p--;
- syn=1;
- }
- } else switch(ch) { //运算符等其它符号识别
- case'<':
- m=0;
- token[m++]=ch;
- ch=str[p++];
- if(ch=='=') {
- syn=29;
- token[m++]=ch;
- } else {
- syn=27;
- p--;
- }
- break;
- case'>':
- m=0;
- token[m++]=ch;
- ch=str[p++];
- if(ch=='=') {
- syn=28;
- token[m++]=ch;
- } else {
- syn=26;
- p--;
- }
- break;
- case':':
- m=0;
- token[m++]=ch;
- ch=str[p++];
- if(ch=='=') {
- syn=24;
- token[m++]=ch;
- } else {
- syn=37;
- p--;
- }
- break;
- case'+':
- syn=20;
- token[0]=ch;
- break;
- case'-':
- syn=21;
- token[0]=ch;
- break;
- case'*':
- syn=22;
- token[0]=ch;
- break;
- case'/':
- syn=23;
- token[0]=ch;
- break;
- case'=':
- syn=25;
- token[0]=ch;
- break;
- case'(':
- syn=33;
- token[0]=ch;
- break;
- case')':
- syn=34;
- token[0]=ch;
- break;
- case'{':
- syn=35;
- token[0]=ch;
- break;
- case'}':
- syn=36;
- token[0]=ch;
- break;
- case',':
- syn=30;
- token[0]=ch;
- break;
- case'.':
- syn=31;
- token[0]=ch;
- break;
- case';':
- syn=32;
- token[0]=ch;
- break;
- case'\n': //去掉换行
- syn=-2;
- break;
- case'#':
- syn=0;
- token[0]=ch;
- break;
- default:
- if(ch != '#')
- syn=-1;
- break;
- }
- }
- int main() {
- printf("请输入字符串:\n");
- while(1) {
- p=0;
- do {
- scanf("%c", &ch);
- str[p++]=ch;
- } while(ch!='#');
- p=0;
- do {
- scaner();
- switch(syn) {
- case 1:
- printf("(%d,%d)\n",syn,sum);
- break;
- case 2:
- printf("(%d,%f)\n",syn,small);
- break;
- case -1:
- printf("Error %c\n", ch);
- break;
- case -2:
- break;
- default:
- if(token[0] != '#')
- printf("(%d,%s)\n",syn,token);
- break;
- }
- } while (syn!=0);
- printf("请再次输入:\n");
- }
- }
运行结果如下
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏