热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

刚写了一个词法分析器

今天忙了一天,做了一个C_minus的词法分析器。下午睡醒后,写了一个文档,介绍了可以分析的范围,测试数据和主要的数据结构和算法。晚上搞了三个多小时,不停地编译,运行,debug。当

今天忙了一天,做了一个C_minus的词法分析器。

下午睡醒后,写了一个文档,介绍了可以分析的范围,测试数据和主要的数据结构和算法。

晚上搞了三个多小时,不停地编译,运行,debug。当看到那期待已久的数据,感觉好爽!

因为编程的时候是对关键字,符号,数字等是分开编的。所以等明天有时间的时候,把几个程序联在一起就可以啦。等全部搞好了,把代码贴出来请大家斧正。

这个东西是编译原理的课程设计中的一个,我是用c写的,也没有用vc做界面。用户在控制台下输入文件的路径,就可以对文件进行词法分析了。

说明文档如下:(第一次写文档,请大家指点)

/************************** 说明文档***********************************

本程序可以对C_minus语言进行词法分析。

 C_minus,不是一种新的语言,她是C语言的一个子集。由Kenneth C.Louden提出并应用于教学。她主要有以下的特性:

C_minus语言的关键字:{else if int return void while},所有的关键字都是保留字,并且必须是小写。所有关键字按字母顺序排列,有利与折半查找(在关键字多的情况下可提高效率);

下面是专用符号:(  )  *  +   ,   -  /    ;   <   =   >   [   ]    {    }  (为简单起见,我已经对C_minus的符号集进行了简化。并且所有符号都按ASCII码的顺序从小到大排列,理由同上)。

其他标记是IDNUM,通过下列正则表达式定义:ID = letter (letter | digit)* ,NUM = digit digit* .letter = a|..|z|A|..|Z|,digit = 0|..|9.注意在C_minus语言中小写和大写字母是有区别的;

空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID,NUM关键字;

注释用通常的C语言符号/ * . . . * /围起来。注释可以超过一行。注意注释不能嵌套。 特别地,引号中的/*......*/不是注释。   (因为考虑注释比较复杂,所以在这个版本中不考虑输入注释的情况)

 

 

type   0            1          2          3

       keyword   num     id       symbol

*********************************************************************/

测试输入1

int  main()

{

   int i = 2;

   int j ;

   if ( i > 0 )

      j = i;

   else

      j = 0;

   return 0;

}

预测输出1

data     ( type,value)

int         (0,2)

main       (2,0)

(          (3,0)

)          (3,1)

{          (3,13)

int         (0,2)

i           (2,1)

=          (3,9)

2          (1,2)

;           (3,7)

int        (0,2)

j           (2,2)

;           (3,7)

if          (0,1)

(           (3,0)

i            (2,1)

>          (3,10)

0          (1,0)

)           (3,1)

j           (2,2)

=          (3,9)

i           (2,1)

;           (3,7)

else        (0,0)

j           (2,2)

=          (3,9)

0          (1,0)

;           (3,7)

return      (0,3)

0          (1,0)

;           (3,7)

}          (3,14)

//****************************************

测试输入2:

I am a genius!

预测输出2:

data     ( type,value)

I          (2,0)

am        (2,1)

a         (2,2)

genius     (2,3)

!          (4,0) illegal  input

//****************************************

 

 

//用到的结构数组:

struct  keyword{

    char  * word;

    int     value;

}keytab[] = {

         "else",0,

         "if",1,

         "int",2,

         "return",3,

         "void",4,

         "while",5,

};

//****

struct   symbol{

      char  c;

      int    value;

}symboltab[] = {

        '(', 0,

        ')', 1,

        '*', 2,

        '+',3,

        ',', 4,

        '-', 5,

        '/', 6,

        ';', 7,

        '<',8,

        '=',9,

        '>',10,

        '[', 11,

        ']', 12,

        '{', 13,

        '}', 14,

};

 

 

 

 

//用到的全局变量

int  countnum 0;

int  countid 0;

 

 

/***********************************

算法如下:

while(读入的字符不是EOF{

       if ( isspace (c) )

            continue;

       else if 是字母){   

           读取整个单词;

           if(是关键字)

               打印出来;

           else{

               countid++;

               打印出来;

            }

       }else if(是数字){

            读取整个数字;

            打印出来;

       }else if ispunctc)){

            在符号表中查找;

            if 在表中)

                 打印出来;

            else

                 调用出错处理程序;

       }

}


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
so杨xi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有