词法分析实验报告

实验一、词法分析实验

商业软件工程专业   李梓维  201506110105

一、 实验目的

通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

二、 实验内容和要求

在原程序中输入源代码

  • 对字符串表示的源程序  
  • 从左到右进行扫描和分解
  • 根据词法规则
  • 识别出一个一个具有独立意义的单词符号
  • 以供语法分析之用
  • 发现词法错误,则返回出错信息

在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

  1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
  2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
  3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
  4. 分隔符:,、;、{、}、(、)
  5. 常数,如123,4587

各种单词符号对应的种别码:

输出形式:

  • 二元式

– (单词种别,单词自身的值)

  • 单词种别,表明单词的种类,语法分析需要的重要信息

– 整数码

  • 关键字、运算符、界符:一符一码
  • 标识符:10, 常数:11
  • 单词自身的值

– 标识符token、常数sum

– 关键字、运算符、界符token

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

      1.源程序名:编译原理 实验报告 中源程序名 算法分析.c

可执行程序名:编译原理 实验报告.exe

      2.原理分析及流程图

 

      3.程序代码

  1 #include<stdio.h>
  2 #include<string.h>
  3 void F(char c,char b);
  4 void word(char a[]);
  5 void number(char a[]);
  6 int i; //定义全局变量i
  7 int s=1; //用来记录是否存在非法字符
  8 main(){
  9        char a[50];
 10        printf("请输入需要分析的字符串:");
 11        gets(a);
 12        printf("您要分析的字符串为:");
 13        printf("%s",a);
 14        printf("\n");
 15        for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++){
 16        if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
 17        word(a);
 18        else if(a[i]>='0' && a[i]<='9')
 19        number(a);
 20        else
 21        F(a[i],a[i+1]);
 22        }
 23        printf("\n");
 24 }
 25 
 26 void number(char a[]) //对数字字符进行扫描分析
 27 {
 28        char b[50];
 29        int m,k=0,t;
 30        m=i;
 31        while(a[m]>='0' && a[m]<='9') 
 32        {
 33        b[k]=a[m]; //用数组b存放数组a中的数字
 34        k++;
 35        m++;
 36        }
 37        i=m-1;
 38        printf("(11,");
 39        for(t=0;t<k;t++)
 40        printf("%c",b[t]);
 41        printf(")");
 42        printf("\n");
 43 }
 44 
 45 void word(char a[]) //对字母字符进行扫描分析,并识别保留字
 46 {
 47 int k=0,m,flag=0,t;
 48 char b[50];
 49 char *key[6]={"begin","if","then","while","do","end"};
 50 m=i;
 51 while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
 52 {
 53     b[k]=a[m]; 
 54     k++;
 55     m++;
 56     b[k]='\0'; 
 57 }
 58     i=m-1;
 59     for(t=0;t<6;t++)
 60     {
 61     if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
 62     {
 63     printf("(%d,%s)",t+1,key[t]); //输出关键字
 64     flag=1;
 65     printf("\n");
 66 }
 67 }
 68     if(flag==0)
 69 {
 70     printf("(10,%s)",b); //输出标识符
 71     printf("\n");
 72 }
 73 }
 74 void F(char c,char b) //对特殊字符进行扫描分析
 75 {
 76     switch(c){
 77       case '+':
 78              printf("(13,+)\n");
 79              break;
 80 
 81       case '-':
 82              printf("(14,-)\n");
 83              break;
 84 
 85       case '*':
 86              printf("(15,*)\n");
 87              break;
 88 
 89       case '/':
 90              printf("(16,/)\n");
 91              break;
 92 
 93       case ':':
 94              if(b=='=')
 95              {
 96               i++;
 97               printf("(18,:=)\n");
 98              }
 99              else
100               printf("(17,:)\n");
101              break;
102 
103        case ' ':
104              break;
105 
106        case '<':
107              if(b=='>')
108              {
109                i++;
110                printf("(21,<>)\n");
111              }
112              else if(b=='=')
113              {
114               i++;
115               printf("(22,<=)\n");
116              }
117              else
118              printf("(20,<)\n");
119              break;
120 
121       case '>':
122              if(b=='=')
123              {
124              printf("(24,>=)\n");
125              i++;
126              }
127              else
128              printf("(23,>)\n");
129              break;
130 
131       case '=':
132              printf("(25,=)\n");
133              break;
134 
135       case ';':
136              printf("(26,;)\n");
137              break;
138 
139       case '(':
140              printf("(27,()\n");
141              break;
142 
143       case ')':
144              printf("(28,))\n");
145              break;
146 
147       case '#':
148              printf("(0,#)\n");
149              break;
150 
151 
152 default:
153 {
154 printf("\n存在字符 '%c',无法继续识别!\n",c);
155 s=0; //用s=0记录存在非法字符
156 break;
157 }
158 }
159 }


       4.运行结果

 

二.实验总结

通过存储输入的字符串,用循环的方式逐个提取出来与种别码比较,然后进行输出。

本人觉得该实验难点在于如何让程序自动识别“ ”与“#”等特殊方式,以及循环的跳出条件,此实验使我对代码的理解更加的深刻。

转载于:https://www.cnblogs.com/WaiD/p/5961265.html

实验一:词法分析 一、实验目的 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验预习提示 1、 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号对应一个种别码的方式。 2、 单词的BNF表示 ----> ----> ----> + ----> - 等等 3、 模块结构(见课本P95-96)(可根据自己的理解适当修改) 三、实验过程和指导: (一) 准备: 1. 阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。 2. 初步编制好程序。 3. 准备好多组测试数据。 (二) 上机: (三) 程序要求: 1. 要求用C++Builder或者Dephi或者VC、VB等可视化编程工具编写;要求有界面(即一般windows下应用程序界面)。 2. 输入为某语言源代码。 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 注:为右大括号 要求(可根据实际情况加以扩充和修改): 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。 常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、=、<=、!= ;单词种别码为4。 分隔符包括: “,”“;”“(”“)”“{”“}”等等, 单词种别码为5。 (四) 程序思路(仅供参考): 0. 定义部分:定义常量、变量、数据结构。 1. 初始化:从文件将源程序输入到字符缓冲区中。 2. 取单词前:去掉多余空白。调用过程GETNB(); 3. 提取字符组成单词,利用课本P97图4.5转换图构造单词扫描过程SCAN(),需要根据实际情况加以修改。 4. 判断单词的种别码,调用过程LOOKUP(); 5. 显示(导出)结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值