实验词法分析实验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验词法分析实验相关的知识,希望对你有一定的参考价值。

一、 实验目的

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

二、 实验内容和要求

在原程序中输入源代码

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

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

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

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

 技术分享

输出形式:

  • 二元式

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

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

– 整数码

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

– 标识符token、常数sum

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

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

#include <stdio.h>
 #include <ctype.h>
 #include <malloc.h>
 #include <stdlib.h> 
 #include <string.h>
 #define NULL 0   
 FILE *fp; 
   char cbuffer;
   char  *key[32]={"if","else","for","break","continue","int","float","double","auto","case","char","const","default","do","enum","long","extern","goto","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};
   char *border[8]={",",";","{","}","(",")","[","]"}; 
   char *arithmetic[4]={"+","-","*","/"}; 
   char *relation[6]={"<","<=","=",">",">=","<>"}; 
   char *consts[20]; char *label[20]; 
   int constnum=0,labelnum=0; 
   int search(char searchchar[],int wordtype) 
{   
   int i=0; 
   switch(wordtype)  
{ 
   case 1:for(i=0;i<=31;i++)  
{   
   if (strcmp(key[i],searchchar)==0)  
   return(i+1);   
}  
   return 0; 
   case 2:   
{  for (i=0;i<=7;i++)   
{   
   if (strcmp(border[i],searchchar)==0) 
   return(i+1);
}    
      return(0);    
}   
   case 3:  
{   
   for (i=0;i<=3;i++)   
{  
   if (strcmp(arithmetic[i],searchchar)==0)  
{   
   return(i+1);  
}   
}   
   return(0); 
}  
   case 4: 
{ 
   for (i=0;i<=5;i++)  
   if (strcmp(relation[i],searchchar)==0)  
    return(i+1); 
   return(0);  
 } 
   case 5: 
{ 
   for (i=0;i<=constnum;i++)  
{   
   if(consts[i] && (strcmp(consts[i],searchchar)==0)) 
    return(i+1);
    }  
   consts[i-1]=(char *)malloc(sizeof(searchchar)); 
    strcpy(consts[i-1],searchchar); 
    constnum++;  
   return(i); 
   } 
 case 6:
   {  
  for(i=0;i<=labelnum;i++) 
    if(label[i] && (strcmp(label[i],searchchar)==0)) 
     return(i+1); 
    label[i-1]=(char *)malloc(sizeof(searchchar));  
  strcpy(label[i-1],searchchar); 
   labelnum++;  
  return(i); 
   } 
default: 
return 0;
  }
 } 
 char alphaprocess(char buffer) 
{ 
 // int atype; 
 int i=-1; 
  char alphatp[20]; 
  while((isalpha(buffer))||(isdigit(buffer))) 
 {  
 alphatp[++i]=buffer;
   buffer=fgetc(fp); 
 }  
 alphatp[i+1]=\\0; 
  if (/*atype=*/search(alphatp,1)) 
//  printf("%s (1,%d)\\n",alphatp,atype-1);
   printf("(1,  \\"%s\\")\\n",alphatp);
  else 
 {  
 search(alphatp,6);
 //  printf("%s (6,%d)\\n",alphatp,atype-1);
   printf("(2,  \\"%s\\")\\n",alphatp);
  } 
  return(buffer);
 }  
 char digitprocess(char buffer)
 {  
 int i=-1; 
  char digittp[20];
 // int dtype; 
  while ((isdigit(buffer))) 
 { 
  digittp[++i]=buffer;
   buffer=fgetc(fp); 
 }
   digittp[i+1]=\\0; 
 search(digittp,5); 
 // printf("%s (5,%d)\\n",digittp,dtype-1);
 printf("(3,  \\"%s\\")\\n",digittp);  return(buffer); 
} 
  char otherprocess(char buffer)
{  
 int i=-1;
   char othertp[20];
 // int otype,otypetp; 
 othertp[0]=buffer; 
 othertp[1]=\\0;  
 if (/*otype=*/search(othertp,3))
  { 
//  printf("%s (3,%d)\\n",othertp,otype-1);  
 printf("(4,  \\"%s\\")\\n",othertp); 
  buffer=fgetc(fp); 
  goto out; 
 } 
  if (/*otype=*/search(othertp,4))
  {  
 buffer=fgetc(fp); 
  othertp[1]=buffer; 
  othertp[2]=\\0;  
 if (/*otypetp=*/search(othertp,4)) 
  {  
//  printf("%s (4,%d)\\n",othertp,otypetp-1); 
   printf("(4,  \\"%s\\")\\n",othertp); 
   goto out; 
  }  
 else 
   othertp[1]=\\0; 
//  printf("%s (4,%d)\\n",othertp,otype-1); 
  printf("(4,  \\"%s\\")\\n",othertp);
   goto out; 
 }  
 if (buffer==:)  
{  
 buffer=fgetc(fp); 
  if (buffer===) 
   printf(":= (2,2)\\n"); 
  buffer=fgetc(fp); 
  goto out; 
 } 
 else 
 {  
 if (/*otype=*/search(othertp,2)) 
  { 
//    printf("%s (2,%d)\\n",othertp,otype-1);
     printf("(5,  \\"%s\\")\\n",othertp);
  buffer=fgetc(fp);
     goto out; 
   }
  }
   if ((buffer!=\\n)&&(buffer!= )) 
  printf("%c error,not a word\\n",buffer);
  buffer=fgetc(fp); 
   out:   
   return(buffer);
 } 
  void main()
 { 
  int i;
     for (i=0;i<=20;i++)
  {  
 label[i]=NULL;  
 consts[i]=NULL; 
 } 
  if ((fp=fopen("example.c","r"))==NULL) 
  printf("error"); 
 else 
 {  
 cbuffer = fgetc(fp);
   while (cbuffer!=EOF) 
  {  
  if (isalpha(cbuffer)) 
    cbuffer=alphaprocess(cbuffer); 
   else 
if(isdigit(cbuffer)) 
    cbuffer=digitprocess(cbuffer); 
   else 
cbuffer=otherprocess(cbuffer); 
  }  
 printf("over\\n");
   getchar(); 
 } 
}  
#inlclude<stdio.h>
 int main()
 { 
     int d,a,c; a=10;
     c=a+b; 
     printf("%d%d",a,b);; 
     return 0;
 }

四.运行结果及分析

技术分享

 

以上是关于实验词法分析实验的主要内容,如果未能解决你的问题,请参考以下文章

实验一 词法分析器+编译原理

实验词法分析实验

201506110135陈若倩词法分析实验报告

lex实现扩展的pl0语言的词法分析器(附源码)

实验一

0930 实验一 词法分析