实验一、词法分析实验

一、 实验目的

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

二、 实验内容和要求

在原程序中输入源代码

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

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

  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;
 }

四.运行结果及分析

时间: 2024-10-13 01:52:06

实验一、词法分析实验的相关文章

实验一 词法分析实验报告

实验一.词法分析实验 专业:商业软件工程2班  姓名 别博文  学号201606110175 一. 实验目的        编制一个词法分析程序. 二. 实验内容和要求 对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息.. 三. 实验方法.步骤及结果测试  源程序名:压缩包文件(rar或zip)中源程序名 ceshi.c 可执行程序名:ceshi.exe 主要程序段及其解释: 实现主要功能的程序段,重

实验一词法分析实验报告

一.        实验目的 (1)    理解词法分析在编译程序中的作用. (2)    加深对有穷自动机模型的理解. (3)    掌握词法分析程序的实现方法. (4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术. 二.        实验内容和要求 1,待分析的简单语言的词法 2,各种单词符号对应的种别码. 3,词法分析程序的功能(输入,输出). 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zi

实验一 词法分析实验

实验一.词法分析实验 一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 三.        实验方法.步骤及结果测试  1.      源程序名:压缩包文件(rar或zip)中源程序名×××.c可执行程序名:×××.exe 2.      原理分析及流程图 把输入的字符用链表进行存储,利用自己构造的一个判断函数,读取字符链表中存储的字符并进行判断处理,如果符合条件则输出,并继续判断直到链表为空则退出. 3.

词法分析实验报告(一)

实验一  词法分析实验 专业:商业软件三班   姓名:曾铭杰  学号:201506110197 一.        实验目的 用C语言设计一个词法分析程序,将字符流的源程序进行分析,从左到右逐个字符地扫描源程序,同时滤掉空格符和回车换行符,逐个读取字符,然后将它们拼在一起组成一个有意义的单词符号,识别出单词的种别及单词自身的值. 二.        实验内容和要求 1.输入一段源程序字符串: 2.输出格式按照二元组(种别,单词符号本身). 三.        实验方法.步骤及结果测试 1.   

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

实验一词法分析试验报告

实验一.词法分析实验 专业:商业软件工程   姓名:林海鑫  学号:201506110120 一.        实验目的 (1)掌握词法分析程序的实现方法. (2)用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术. (3)理解词法分析在编译程序中的作用. (4)加深对有穷自动机模型的理解. 二.        实验内容和要求 1,词法分析程序的功能(输入,输出). 2,待分析的简单语言的词法. 3,各种单词符号对应的种别码. 三.        实验方法.步

实验1 词法分析

格式说明:排版时注意按此模板的字体,字号和行距. 报告提交和打印输出时请去掉此框. 实验一.词法分析实验 商软1班   周展鹏  201506110114 一.        实验目的        通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解. 二.        实验内容和要求 在原程序中输入源代码 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则 识别出一个一个具有独立意义的单词符号 以供语法分析之用 发现词法错误,则返回出错信息 在

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

203-陈冠权-词法分析实验报告

实验一.词法分析实验 专业:商业软件工程3班   姓名:陈冠权  学号:201506110203 一.实验目的 通过设计编译程序完成一个词法分析器,加深对词法分析的理解. 二.实验内容和要求 输入一连串的字符,即保留字.标识符.常数.运算符和分隔符,通过词法 分析器来识别具有独立意义的字符,并输出各个字符的内部编码. 三.实验方法.步骤及结果测试 1.   源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 要求在主函数输入字符串,将字符串存入数组里面,调用