关于SAP ABAP开发环境,Jerry之前写过几篇公众号文章:

  • 那些年我用过的SAP IDE
  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  • 使用Visual Studio Code编写和激活ABAP代码

本文从另一个角度出发,单独聊聊ABAP开发环境里的语法高亮话题。

俗话说,佛靠金装,人靠衣装。咱们程序员虽然平日上班都穿千篇一律的职业装:


程序员专用的格子伞:


Jerry衣柜里最不缺这种衣服:

但幸好我们的开发环境还是能够进行各种个性化设置,所以虽然大家都穿着一样的格子衫,但面对的却是色彩各异的开发环境。比如SAPGUI的Options选项,给ABAP开发人员提供了种类丰富的ABAP编辑器UI元素风格的自定义设置,诸如背景色,关键字高亮颜色,注释高亮颜色,断点高亮颜色等等。


我们点了Save按钮后,这些个性化设置保存在本地某处。那么以ABAP编辑器为例,当我们用它来编写代码时,ABAP语言里的语法元素是如何根据不同的类型,进行对应的颜色高亮显示呢?

在SAPGUI设置选项里,进入Traces->Session Traces, 点击Enable按钮打开ABAP Editor的trace开关,回到ABAP编辑器,随便做一些操作,比如加一段注释,几个空格,激活代码之类。


然后打开生成的trace文件:
C:\Users<user name>\AppData\Local\SAP\SAP GUI\Traces\sapfewdll_01_0001_00_4272_2800.trc

能看到大段大段的CStyleCache::OnLinesChanged和CAbapFgLexer::InternalLexer这种C++里类的方法调用。

  • 189行:InvalidateLineStyle - 准备重绘ABAP代码第43883行的语法高亮
  • 190~191行:FindBeginOfStatement + FindEndOfStatement:找到这一行ABAP语句的起始和结束位置。
  • 193行:synchronous syntactical analysis started - 开始同步模式的语法分析
  • 195行:调用C++实现的编译器方法m_parser->run, 来完成ABAP语句的语法解析,总共花了89微秒。
  • 196行:分析结束。
  • 197行:根据编译器的分析结果,调用ISyncStyleCache::SetStylesSync进行对应元素的语法高亮显示。

从trace文件不难看出,这个ABAP语句语法分析和语法高亮渲染的同步过程会逐行处理语句,大家平时几乎感觉不到任何时延,是因为编辑的ABAP代码行数较少。

当Jerry在本地编辑ABAP git这个开源项目时,因为report源代码有将近五万行,所以当修改完代码激活之后,会感觉到长达好几秒钟的时延,在这几秒钟内,SAPGUI里的C++实现的编译器在忙碌地进行ABAP语句解析和语法高亮的工作。 在这些工作未完成之间,ABAP编辑器里将不会有语法高亮效果显示:​

如果不考虑cache的情况,在Jerry手上用的Thinkpad P50电脑上,假设按每行解析花费89微秒来计算,ABAP Git的语法高亮大概会消耗4秒钟的时间。


说完了SAPGUI,再来看看其他ABAP开发环境。虽然SAP WebIDE还不能做ABAP开发,但是在S/4HANA里,我们也能在浏览器里用ABAP编写Custom Logic了,并且支持语法高亮。

你也许会问,ABAP的语法高亮是如何在浏览器里显示的?自己动手,丰衣足食。

下面跟Jerry一起来通过调试的方式,自己找到问题的答案。

(1) 在浏览器里敲个ABAP的关键字,比如data。发现被高亮显示了。通过Chrome开发工具发现高亮是通过一个叫ace_keyword的css类实现的。

在Chrome开发工具里以关键字".ace_keyword"搜索: 发现这个css类是硬编码在theme-sap-cumulus.js里的。

(2) 现在需要找到浏览器里进行ABAP代码编辑的编辑器的实现。在Chrome开发工具里Network tab里输入“.xml”作为过滤条件,于是找到编辑器的Fiori实现: Editor.view.xml

具体的编辑器是实现在命名空间reuse的ABAPWrapper标签里。

根据这个命名空间找到实现ABAP编辑器的UI5应用,如下图: nw_aps_ext_lib.


打开ABAPWrapper-dbg.js, 在第68行设置断点。这个函数负责从ABAP后台取PAD文件,该文件和语法高亮有关。

刷新ABAP编辑器页面,断点触发,在调试器里观察PAD文件的内容:

所有的ABAP关键字都列在该PAD文件里,这样UI5就知道编辑器里哪些字符串应该做高亮显示。


(3) 最后一个问题就是,比如当我敲了一个ABAP关键字"new"之后,UI5应用具体哪行代码将对应的css类加到这个字符串对应的DOM节点上?

如下图,一旦我敲了一个字符w之后,字符串new作为一个关键字需要被高亮:

具体逻辑如下图:一旦敲入字符"w"后,onInput作为事件处理函数触发:


函数$renderLine负责生成对应的HTML源代码。输入字符"new"被传入函数getLineTokens来计算该字符串是关键字还是普通变量。

在文件AceRndTokenizer.js里, ABAP解析器按照我们期望的将“new”解析成关键字,因为解析器拥有PAD文件的引用,因此它知道哪些字符串是关键字,哪些是普通变量。

(4) DOM节点的源代码在此处生成,"ace"和“keyword"做连接操作,生成最后我们在Chrome开发工具里看到的完整css类ace_keyword.

谜底就这样揭晓了。

至于其他工具,比如Visual Studio Code,Sublime Text之类,严格意义上讲不能算作ABAP的开发环境,只能看成是ABAP代码的查看工具,其ABAP语法高亮的实现,咱们下次再聊,感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

ABAP开发环境语法高亮的那些事儿的更多相关文章

  1. ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了

    Jerry进入SAP成都研究院前,一直是用C/C++开发,所以刚接触ABAP,对于她在某些语法环境下大小写敏感,某些环境下不敏感的特性很不适应.那时候Jerry深深地怀念之前在C/C++编程时遵循的驼 ...

  2. 环境搭建基础知识2(sublime text3中配置verilog语法高亮)

    需求说明:Verilog设计 内容       :verilog开发环境搭建 来自       :时间的诗 1 软件下载 1.1 官方下载 地址http://www.sublimetext.com/3 ...

  3. ABAP的语法高亮是如何在浏览器里显示的

    这篇文章的原文我发表在SAP官方社区上:https://blogs.sap.com/2018/03/09/how-abap-syntax-highlight-is-implemented-in-web ...

  4. 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?

    Jerry在之前的文章多次提过,SAP Cloud Platform ABAP编程环境上的ABAP语法,只是广大SAP顾问们在On-Premises环境上使用的ABAP的一个子集.换句话说,On-Pr ...

  5. ABAP Development Tools的语法高亮实现原理

    ABAP Development Tools的前端是Java,根本识别不了ABAP.那么在ADT里的ABAP语法高亮是如何实现的? 第一次打开一个report时,显示在ADT里的代码是没有任何语法高亮 ...

  6. Java 教程(开发环境配置+基础语法)

    Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...

  7. ES6开发环境准备及基础语法

    ES6开发环境准备及基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 三.

  8. SAP ABAP 快速入门之 开发环境 (Environment)

    报表是学习ABAP 原则和工具的很好的 起点.ABAP 报表在许多领域都有使用,本章将介绍简单ABAP 报表的开发. Hello ABAP 让我们以'Hello World' 开始. 每一个abap ...

  9. react 基础语法复习1- 搭建开发环境

    之前有看过阮一峰老师的react教程跟着做了一遍,学习了一下.好久没看,有点忘记了,这次跟着脚手架工具系统的复习一遍.顺便学习学习 react-router 和 redux 首先,脚手架工具我使用的是 ...

随机推荐

  1. 对数损失函数logloss详解和python代码

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  2. revit 碰撞检测相关

    Revit二次开发:由房间获取房间的墙     之前用的方法是由房间边界构成的Solid,计算与该Solid相交的Element,然后判断是否为墙.相对来说这个方法比较通用,可以检索出房间的楼板.窗户 ...

  3. layui 复选框checkbox 实现全选全选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Look Further to Recognize Better: Learning Shared Topics and Category-Specific Dictionaries for Open-Ended 3D Object Recognition

    张宁 Look Further to Recognize Better: Learning Shared Topics and Category-Specific Dictionaries for O ...

  5. kafka中的配额管理(限速)机制

    kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使用kafka的配额管理功能. 1 K ...

  6. DBCP(MySql)+Servlet+BootStrap+Ajax实现用户登录与简单用户管理系统

    目  录   简介 本次项目通过Maven编写 本文最后会附上代码 界面截图 登录界面 注册界面 登录成功进入主页 增加用户操作 删除用户操作 修改用户操作 主要代码 Dao层代码 DBCP代码 Se ...

  7. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

  8. C++ 工程师养成 每日一题4.5 (迭代器遍历)

    首先说明,当每日一题标号不是整数时代表此题是较为简单的,我在这里整理一遍主要是我做错了(没错是我太菜各位大佬无视就好) 题目: 读入一个字符串str,输出字符串str中的连续最长的数字串 此题思路清晰 ...

  9. 解决html 图片缓存问题

    <!--问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) ...

  10. CLRS10.1-7练习 - 用双队列实现栈

    算法中心思想: 始终向非空队列进行入队操作 初始化时两个队列都为空,我们对q1进行入队操作 入栈: 只需执行其中一个队列入队操作即可, 具体操作哪一个队列,用一个标记变量标记 出栈流程图 代码实现 p ...