基于Vim的DarwIn机器人开发集成平台

2020-11-04 06:34高玲玲戴秉秩
黑河学院学报 2020年10期
关键词:词法自动机适配器

高玲玲 戴秉秩

(1.合肥学院 人工智能与大数据学院,安徽 合肥 230023;2.合肥移瑞通信技术有限公司,安徽 合肥 230088)

1 背景介绍

DarwIn机器人由于其设备特点,开发过程与服务器开发类似,基本采用SSH远程连接方式开发[1]。但使用SSH远程连接的方式存在无法在终端中运行图形化开发工具的弊端。若采用文本编辑器在终端中运行,又不具有友好的集成开发环境。如果在桌面系统进行开发,则需要拷贝源码,开发过程十分复杂。本项目旨在为DarwIn机器人的开发提供一个友好的、能运行在终端环境中的集成开发环境。在DarwIn机器人开发过程中,可以采用SSH远程连接方式开发,也可以在PC端进行开发,本项目需要能够兼容这两种方式。

2 系统设计与实现

2.1 系统结构框架

根据IDE的使用场景及Vim的特点,IDE的总体功能采用模块化设计,每个功能模块之间相互独立,Vim负责与用户进行交互,并与各个模块通信,如图1所示。

图1 IDE软件框架

2.2 子功能模块的设计与实现

2.2.1 文件列表及代码标签查看模块设计与实现

文件列表查看模块需要支持文件夹的打开与关闭,文件的快速打开编辑等功能,该模块采用分离式设计,由交互窗口、适配器和运算器三部分组成,其运算器使用Linux标准工具包的ls工具来实现[2]。

代码标签查看模块与文件浏览模块类似。针对不同的语言,存在代码标签格式不同的问题,因此,本项目在适配器层面引入二级适配器结构。一级适配器负责将运算器传递的标签进行简单处理,并筛选对应开发语言的二级适配器,将处理结果传递给二级适配器;二级适配器根据一级适配器的筛选结果,使用对应语言的处理模块,对代码标签进行处理,并将处理结果返回给一级适配器。适配器分级后,可以使原本固定的适配器变成一个可拓展的结构。

一二级适配器的接口使用字典的数据结构,字典的Key为标签类型,Value为一个列表,其中包含该类型的所有标签。采用如下方式实现可扩展框架:(1)维护一个filetype变量,存放需要生成代码标签的代码文件类型;(2)语言适配器统一存放在autoload目录下,命名均使用“语言对应文件类型tags.vim”;(3)语言适配器中提供一个“GenerateTags()”函数,该函数返回处理后的标签字典。工作流程,如图2所示。

图2 DTag工作流程

2.2.2 C++代码自动格式化模块设计与实现

根据使用场景,该模块的结构划分为句子合成器和词法分析器。Vim将句子送入词法分析器,词法分析器对句子进行分割,并将分割后的词法单元送入句子合成器[3]。句子合成器按照规则,向词法单元中添加空白符。

然而,从代码分割出词法单元的过程,实际上是正则表达式匹配的过程。该过程中,有些多字符词法单元将会被过度分割,如注释符“//”将被匹配成两个除法符号。因此,单纯地使用正则表达式显然是无法解决过度分割问题,因此,引入自动机解决被过度分割的运算符重组成新的词法单元。例如,“//”符号将被词法分析器识别成“Divide Divide”,为将其修改为“Comment”,在此处添加一个自动机,当符号被该自动机接收时,读入的符号为“//”,可将其修改为词法单元“Comment”。

2.2.3 Makefile生成模块设计与实现

Gencmake模块实现递归遍历项目文件夹中的所有代码文件,并分析其依赖关系,生成一个中间文件,用户可以编辑该文件,最后使用第三方工具根据该中间文件生成Makefile[4]。根据该操作流程,将Gencmake的框架划分为代码分析器和文件检索器。代码分析器将代码所依赖的文件传递至文件检索器,文件检索器检索该文件,并将路径传递给代码分析器,这是一个递归的过程。递归后Gencmake将能够检索出项目的全部依赖关系,并生成中间文件,但如果依赖项以静态链接库的形式存在,则需要用户自行给出依赖关系并编辑中间文件。

2.2.4 DarwIn参数调节模块设计与实现

由于DarwIn提供了一个可以调节参数的Web服务器,因此,DarwInSetting模块的本质是一个爬虫应用,通过爬取Web页面的内容来显示到Vim上,再通过Post方法将修改后的参数传递至DarwIn的Web服务器,该模块的框架可以划分为交互窗口和爬虫,如图3所示。

图 3 DarwInSetting模块框架

而该模块工作流程,如图4所示。

图4 DarwInSetting工作流程

3 关键技术

3.1 正则表达式优化

从正则表达式引擎的角度分析,正则表达式引擎大量使用NFA(非确定有限状态自动机)作为解析器,而NFA在执行过程中,最影响效率的过程是回溯[5]。正则表达式的优化,就是要减少正则NFA解析器在匹配过程中的回溯。

结合回溯过程和正则表达式的语法特点,在编写正则表达式时,需要注意以下几点:

(a)尽量避免多选结构。例如,表达式“a|b|c|d|e|f”与表达式“[a-f]”匹配同样的字符,但前者将会有六个备用状态等待引擎回溯,这必然会造成效率的降低。

(b)提取锚点“^”“$”。例如,表达式“^a|^b”会比表达式“^(a|b)”多出一个备选状态,但二者的匹配功能是相同的。

(c)尽量避免回溯的时间复杂度指数级增长。如“([^/]+)*”,每次匹配都需要判断字符应属于“+”量词还是属于“*”量词,这样如果匹配一个长度为10的字符串,这样需要回溯(2^10)-1次,这种指数级增长的回溯会极大地降低匹配效率。

(d)从闭包中提取必需元素。如“a+”可以将其提取为“aa*”,这样可以减少正则式的一个备用状态。

(e)减少括号的使用。正则表达式中的元字符“()”会改变匹配的优先级,造成回溯现象,减少括号的使用,并减少回溯次数。

3.2 自动机

序列检测自动机匹配各种合适的序列并将其送至合成器,合成器根据序列的类型向其中添加空格。需要检测的词法单元包括注释、字符串等,自动机模型如图5、6、7所示。经过自动机处理后,原本被过度分割的词法单元能够重新组合成新的词法单元,以保证格式化的正确性。

图5 用于检测左块注释符的自动机模型

图6 用以检测右块注释符的自动机模型

图7 用以检测字符串的自动机模型

4 模块测试

4.1 文件列表及代码标签浏览查看模块

文件列表查看模块工作情况如图8所示,代码标签浏览模块如图9所示。

图8 文件列表查看模块

图9 代码标签查看模块

4.2 C++语法高亮模块测试

C++语法高亮模块加载效果如图10所示。

图10 加载语法高亮插件前后

4.3 C++自动格式化模块测试

C++自动格式化模块加载效果如图11所示。

图11 自动格式化前后

5 结论

本文借助Vim作为核心组件,使用VimScript和Python语言开发了一套能够用于DarwIn机器人开发工作的集成开发环境,应用该IDE能使DarwIn机器人的开发工作变得方便快捷。本文先就系统的可行性和用户需求进行了详细的分析,并根据需求对各个模块进行了详细的设计,同时,介绍了在实现各个模块时所用到的技术与原理,最后展示了整个IDE的运行效果,达到了准确和易用的设计目标。

猜你喜欢
词法自动机适配器
几类带空转移的n元伪加权自动机的关系*
基于自动机理论的密码匹配方法
一种基于模糊细胞自动机的新型疏散模型
一种基于模糊细胞自动机的新型疏散模型
应用于词法分析器的算法分析优化
基于3D打印的轻型导弹适配器
潜空导弹垂直发射出筒适配器受载变形仿真研究
电源适配器怎么选
美国麦格普公司新型M—LOK相机三脚架适配器
基于AIS的航道移动瓶颈元胞自动机模型