基于Perl的企业级代码编辑器的实现

点赞:26314 浏览:120190 近期更新时间:2024-02-27 作者:网友分享原创网站原创

摘 要:该文针对软件企业进行代码的整理工作这个需求,设计和实现了一个基于Perl的代码编辑器系统,让它按照企业要求进行整理代码的工作,达到提高软件质量管理的目的.

关 键 词:PERL;代码编辑

中图分类号:TP311文献标识码:A文章编号:1009-3044(2013)22-5281-04

1概述

为了管理代码,有些公司要求在软件产品完工后,按照自己规范标准整理代码.但是,每项软件产品可能是分给多个外包公司完成的,产品整合后,如果要一个个手动的删除所有外包公司的附加注释信息,再加入自己的版权信息,势必消耗大量的不必要的人力物力.

在这种情况下,该文描述了一种代码编辑器的设计与实现,它专门用于企业按照规范化的标准处理源代码.

2设计思路

2.1开发工具选择

我要设计的代码编辑器与常见的UltraEdit等编辑器完全不同:首先,我们要处理的源文件容量非常大,有的源文件一个就有上百兆,普通编辑器根本无法打开.其次,我们要进行的处理比较特殊,普通编辑器也无法胜任——比如删除各种注释符这种操作,普通编辑器或者无法做到,或者会处理错误.

比较后我选择了Perl这种开发工具.它不需要编译器和链接器来运行代码,有一套功能非常强大的用于文本处理的特性,可以处理几乎所有我们能够想到的文本变换方式,对于为大型事件创建原型来测试潜在的解决方案是十分理想的.

正则表达式是Perl最强大的特性之一,它们几乎提供了所有用来匹配,置换和一般地截取文本的功能.在Perl中,向一块文本中插入字符称为插值.当Perl遇到一个可以被查值的字符串时,Perl先扫描整个字符串,看看其中是否有下面三个重要的字符:$,@和\.如果存在上面三个字符中的任意一个,而且该字符没有用反斜杠作前缀表示转义,则该字符马上会触发文本的插值操作.\为插入一个元字符或字符代码;$为在标量上下文中插入一个标量变量或计算一个表达式;@为在一个列表上下文中插入一个数组变量或计算一个表达式.如果没有,Perl会使用字符串本身.正则表达式可以用.来匹配任何单个字符.因此十分灵活.

Perl中的文件句柄是一种非常独特的数据类型.这种数据类型与标量没有任何关系.文件句柄在符号表typeglob中有它们自己的槽.在进行数据写入时,首先将数据缓存在缓冲器中,直到有足够多的数据时才进行实际的发送;而在进行数据读取时,也从设备中读取比当前请求的数据量更多的数据到缓冲器中.对于文件,这样能最大限度减少所需的磁盘访问次数,而对于其它类型的文件句柄,这样做能够最大限度减少系统所需进行的中断次数.

虽然Perl的功能非常强大,但是它的文本运行模式导致它难以使用.因此,可视化是它的一个发展方向.而Perl/Tk为Perl程序的开发,分析和可视化方面提供了图形化的支持.用Perl/Tk可以包装Perl写出的所有脚本,本应该在文本模式下运行的命令可以在一个有同样效果的GUI控制面板上执行,用户把它启动后就可以方便地使用它而不必再输入命令.

2.2设计与实现

这个编辑器应该包括至少三个模块:

1)功能设计模块.用于实现这个代码编辑器的各种功能.

2)问题处理模块.用于处理编辑器运行中可能出现的问题.

3)界面设计模块.用于将这个编辑器界面化,使之容易操作.

2.3代码编辑器实现中的难点

误删是一个会导致所处理源代码出现错误的原因.为了处理这个问题,应设置Log记录和查看的功能.可以利用Perl的文件创建,输入输出等功能,在删除文件的同时,建立一个Log文件,记录被删除或更改的内容.在处理后查看Log文件确定操作是否正确.

3系统设计

基于Perl的企业级代码编辑器运行在装有Perl和Perl/Tk的Linux平台上.该编辑器具有强大的文本处理能力,能删除各类注释行,整理Tab/Space空行,及在文件头加入特定注释,删除或替换想要处理的字符或字符串.

3.1系统概要设计

3.1.1功能模块

功能模块接受从界面传来的命令和参数,按照命令和参数调用相应的模块.它主要包括进行综合处理的模块,C注释符处理模块,C++注释符处理模块,#if0注释符处理模块,Tab/Space处理模块.

综合处理模块负责接受界面传来的命令和参数,将它传给要调用的模块.调用的模块做完相应处理后,它要把结果再传给界面模块,让界面上显示相应的结果信息.模块还要根据返回值调用问题处理模块,根据返回值确定是做Log记录还是出错记录.


各个具体处理模块则负责进行处理并传送一个返回值给综合处理模块.C注释符处理模块删除所处理目录下的所有源文件的C注释符,C++注释符处理模块删除C++注释符,#if0注释符处理#if0注释符,Tab/Space处理模块处理Tab字符和文本整理.这些模块的返回值只有0和1,为0说明处理失败,为1说明处理成功.

特殊处理模块中Add操作处理只返回0或1,删除和替换处理还有可能返回一个为2的值:当返回值为2说明没有找到要处理的内容.功能模块得到这个值后传给界面模块,再显示相应的信息框.

3.1.2界面功能模块

界面窗口由主窗口,两个文件夾对话框,一个文件对话框,一个文本框,8个信息提示框构成.主窗口由8个Frame构成,最上面的两个Frame中都有一个Label,一个输入框,两个按钮组成.在这里可以选择要处理的文件目录,要存放Log文件的目录,查看Log文件,进行代码处理.

下面又分为左右两部分.左边有一个Frame专门放置了一个列表框,用于显示要处理的文件目录中有哪些子目录和源文件.3个Frame用于放置做添加,删除,替换这些特殊处理的控件,控件由Label,输入框,按钮组成.可以在列表框里查看文件和目录.可以进行各种特殊处理.界面右下有两个Frame,一个放置复选框控件和下拉框控件,另一个放置Exit按钮.

3.1.3问题处理模块

问题处理模块要针对可能出现的问题进行设计.实际设计中包括两部分:对注释符的优先级进行判定;对Log的记录.

对注释符的优先级判定在处理每行时都要调用,设计时按照各种所见到的用例排定优先处理级别,之后按照顺序处理传输过来的代码行.

基于Perl的企业级代码编辑器的实现参考属性评定
有关论文范文主题研究: 关于模块的文章 大学生适用: 函授论文、大学毕业论文
相关参考文献下载数量: 68 写作解决问题: 本科论文怎么写
毕业论文开题报告: 标准论文格式、论文目录 职称论文适用: 核心期刊、中级职称
所属大学生专业类别: 本科论文怎么写 论文题目推荐度: 最新题目

在功能模块得到返回值后,会调用Log记录模块,根据返回值做不同的记录:返回值为0,做错误记录;返回值为1,做处理记录.

3.2主函数模块

3.2.1Cleanup函数模块

在Cleanup函数中,定义了各类全局变量,调用了包括界面处理的Disp.pm等各模块,用变量获得界面部分传来的参数.

3.2.2Main函数模块

在Main函数中,用全局变量g_type来传递操作类型:设置一个变量$oper_type接受g_type传来的值,如果它在0到8之间,那么值不变;如果它在9到16之间,那么将控制Tab/Space处理的布尔值$bTabSpace置1,再将$oper_type自身减去8以判断要进行的操作.如果是16,17,18,则进行相应的删除,替换,追加信息处理.

Main模块还要将运行产生的返回值传递给界面模块.返回值有3个:0位出错;1为执行成功;2为删除处理或替换处理中的特殊情况——没找到要删除或要替换的内容.

3.2.3文件目录处理模块

程序通过ProcessFolder函数进行对文件夹的处理.

函数设了一个变量$sPureFolder,用判断其是否为空(””)来判断文件夹打开中是否产生错误.

如果在界面上选择了处理子目录,那么变量$bProcessSubFolders将被赋1,用正则式!/^\.\.?$/搜索出所有子项目,并且对这些子项目进行递归处理:如果是目录,那么用readdirDIRHANDLE更新存取目录的文件句柄;如果不是,则用closedir(DIRHANDLE)关闭目录句柄并返回0.

如果对文件夹的操作成功了,最后将返回一个1.那么再开始进行具体的处理.

3.3功能模块

3.3.1C注释符处理

3.3.2C++注释符处理

3.3.3#if0注释符处理

3.3.4Tab/Space处理

3.4Log记录处理

在进行文件处理时,所处理的内容通过一个句柄放在一个临时文件里,如果在处理中产生错误,那么这个错误也会被写入log文件中.

程序运行时,中要打开上已被创建的目录,用my($sLogFileName)等于$sFileName.".log";创建一个后缀名为.log的日志文件,之后做一个判断:因为进行Tab/Space操作是不记入Log的,所以要看所操作的类型以决定要进行的Log操作:如果操作模式不等于8,那么要不断把产生的记录追加到Log文件中;否则,不进行追加操作.函数中用一个临时句柄监控错误的发生.如果在创建或者打开Log文件时产生错误,那么将调用PrintErrLogFile句柄,并返回0;如果创建或打开Log文件时没有错误,在执行过程中产生了错误,那么先把产生的错误写到临时句柄中,再用将产生的错误记录到Log中,覆盖原记录,并返回0.如果一直没有错误,那么将一直在临时文件中追加记录,最后写入Log文件中.

4结束语

该系统针对软件企业需要整理代码的需求设计而成,用于在Linux环境下整理大量的源代码.基于Perl的强大性,这个代码编辑器实现的功能可根据企业的需要作出不同调整.用Perl/Tk作出的界面也可根据个人喜好进行改动.