词法分析实验报告

一、        实验目的

 

     掌握词法分析的设计方法。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符五大类。

 

二、        实验内容和要求

      读取键盘输入的字符,读取后进行词法分析判断输入的字符是关键字、标识符、常数、运算符、界符中的哪一类。

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

 

  1. 1.      源程序名:词法分析.c

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

  1. 2.      原理分析及流程图

将关键字、标识符、常数、运算符、界符保存在二维数组当中,在输入字符之后,进行分析,先判断是否为常数,当输入的字符不为常数时,再进一步进行分析,判断是否是保存在二维数组中的字符,如果也不是保存在二维数组中的字符时,即为标识符,如果是二维数组中的字符时,则返回word[i][1]中的i值到主函数,进行判断是关键字、常数、运算符、界符中的哪一类。

 

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

 

  1 #include<stdio.h>
  2 
  3 #include<string.h>
  4 
  5 #define Max 100
  6 
  7 int number(char str[],int i,int N);//判断输入的字符是不是常数//
  8 
  9 int Ana(char str[]);//判断输入的字符是不是保存的关键字、标识符、常数、运算符、界符//
 10 
 11 char *word[Max][1]={"#","begin","if","then","do","end","while","l(l|d)*","dd*","+","-","*","/",":",":=","<","<=",">",">=","=",";","(",")","[","]","{","}"};
 12 
 13 //用二维数组保存关键字、标识符、常数、运算符、界符//
 14 
 15 char str[Max];
 16 
 17 main()
 18 
 19 {
 20 
 21     int j,i=0,x;
 22 
 23     printf("输入要进行分析的词(输入#时结束)");
 24 
 25     do
 26 
 27     {
 28 
 29         scanf("%s",str);
 30 
 31         if(strcmp(str,"#")==0)//当输入的字符为#时,结束程序//
 32 
 33         break;
 34 
 35         j=number(str,i,strlen(str));//调用number函数,判断输入的字符是不是常数//
 36 
 37         if(j==1)
 38 
 39             printf("%s\t是数字\n",str);
 40 
 41         else if(j==0)
 42 
 43             {
 44 
 45                 x=Ana(str);//调用Ana函数,判断输入的字符是不是保存的关键字、标识符、常数、运算符、界符//
 46 
 47                 if(x>=1&&x<=7)//当Ana函数返回的值为1~7时,输入的字符为关键字//
 48 
 49                 {
 50 
 51                     printf("%s\t是关键字\n",str);
 52 
 53                 }
 54 
 55                 else if(x>7&&x<=18)//当Ana函数返回的值为8~18时,输入的字符为运算符//
 56 
 57                 {
 58 
 59                     printf("%s\t是运算符\n",str);
 60 
 61                 }
 62 
 63                          else if(x>18&&x<=26)//当Ana函数返回的值为19~26时,输入的字符为界符//
 64 
 65                 {
 66 
 67                     printf("%s\t是界符\n",str);
 68 
 69                 }
 70 
 71                 else//当Ana函数返回的值不是1~26的任意一个数字时,输入的字符为标识符//
 72 
 73                 {
 74 
 75                     printf("%s\t是标识符\n",str);
 76 
 77                 }
 78 
 79             }
 80 
 81             getchar();
 82 
 83     }while(strcmp(str,"#")!=0);
 84 
 85     printf("程序结束!\n");
 86 
 87 }
 88 
 89 int number(char str[],int i,int N)
 90 
 91 {
 92 
 93     if(i==N)
 94 
 95         return 1;//当i与字符的长度相等时返回1//
 96 
 97     if(str[i]>47&&str[i]<58)
 98 
 99     {
100 
101         number(str,i+1,N);//当str[i]为0~9的数字时,进行递归//
102 
103     }
104 
105     else
106 
107         return 0;//当str[i]不再为0~9的数字时,返回0//
108 
109 }
110 
111 int Ana(char str[])
112 
113 {
114 
115     int i;
116 
117     for(i=1;i<26;i++)
118 
119     {
120 
121         if(strcmp(str,word[i][1])==0)
122 
123             return i;//当str与二维数组保存的字符相同时,返回i的值//
124 
125     }
126 
127     return 0;//如果str与二维数组保存的字符没有相同的字符时,返回0//
128 
129 }

 

 

 

2.      运行结果及分析

 

四、        实验总结

 

在本次实验中,我对编译原理有了进一步的了解,实验过程中对于字符的输入和对输入的字符的分析欠缺了考虑,在同学的帮助下进行了修正,在多次调试和改进后,最终完善了程序,在修改的过程中,学习过的知识得到了巩固和补充。

转载于:https://www.cnblogs.com/hkvbm/p/5955383.html

【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统一定义; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名),结果文件中每行按如下方式组织: 单词类别码 单词的字符/字符串形式(中间仅用一个空格间隔) 单词的类别码请统一按如下形式定义: 单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码 标识符 IDENFR else ELSETK - MINU = ASSIGN 整形常量 INTCON switch SWITCHTK * MULT ; SEMICN 字符常量 CHARCON case CASETK / DIV , COMMA 字符串 STRCON default DEFAULTTK < LSS ( LPARENT const CONSTTK while WHILETK GRE [ LBRACK char CHARTK scanf SCANFTK >= GEQ ] RBRACK void VOIDTK printf PRINTFTK == EQL { LBRACE main MAINTK return RETURNTK != NEQ } RBRACE if IFTK + PLUS : COLON 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】要求将词法分析结果输出至output.txt中。 【特别提醒】(1)读取的字符串要原样保留着便于输出,特别是数字,这里输出的并不是真正的单词值,其实是读入的字符串,单词值需另行记录。 (2)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (3)在今后的错误处理作业中,需要输出错误的行号,在词法分析的时候注意记录该信息。 (4)单词的类别和单词值以及其他关注的信息,在词法分析阶段获取后,后续的分析阶段会使用,请注意记录;当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【文法定义】请到“2020年文法定义(用于查看文法,不计入成绩)”作业中查看文法 【样例输入】 coNst int cONst1 = 001, const2 = -100; const char const3 = '_'; int change1; char change3; int gets1(int var1,int var2){ change1 = var1 + var2; return (change1); } void main(){ printf("Hello World"); printf(gets1(10, 20)); } 【样例输出】 CONSTTK coNst INTTK int IDENFR cONst1 ASSIGN = INTCON 001 COMMA , IDENFR const2 ASSIGN = MINU - INTCON 100 SEMICN ; CONSTTK const CHARTK char IDENFR const3 ASSIGN = CHARCON _ SEMICN ; INTTK int IDENFR change1 SEMICN ; CHARTK char IDENFR change3 SEMICN ; INTTK int IDENFR gets1 LPARENT ( INTTK int IDENFR var1 COMMA , INTTK int IDENFR var2 RPARENT ) LBRACE { IDENFR change1 ASSIGN = IDENFR var1 PLUS + IDENFR var2 SEMICN ; RETURNTK return LPARENT ( IDENFR change1 RPARENT ) SEMICN ; RBRACE } VOIDTK void MAINTK main LPARENT ( RPARENT ) LBRACE { PRINTFTK printf LPARENT ( STRCON Hello World RPARENT ) SEMICN ; PRINT
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值