欢迎浏览sook云!

网站地图

当前位置:主页 > 云存储 > 产品介绍 >

网站建设_如何进行企业网站的优化_免费

时间:2022-05-12 05:10

人气:

作者:sook云

导读:我对编程语言实现技术和领域特定语言感兴趣已经有相当一段时间了,还实现了一些dsl,但还没有在ABAP中实现。浏览一下,我没有发现关于在ABAP中实现dsl的太多信息,一个值得注意的...

网站建设_如何进行企业网站的优化_免费

我对编程语言实现技术和领域特定语言感兴趣已经有相当一段时间了,还实现了一些dsl,但还没有在ABAP中实现。浏览一下,我没有发现关于在ABAP中实现dsl的太多信息,一个值得注意的例外是使用宏。明智地使用它们,这展示了一种在ABAP中编写内部DSL的方法。

通过这篇文章,我想为在ABAP中实现外部DSL提供一个收据。我还将提供一些助手类,但我的主要目的是展示如何在纯ABAP中解析DSL,而无需花费太多精力。我认为DSL的主要障碍是开始并找到一种可行的方法。所以让我们开始…

作为示例,南昌大数据,我们将为日期和日期范围列表创建解析器。例如,我们的解析器应该能够将输入字符串

2015-01-01–2015-01-15、2015-01-20、2015-10-10–2015-10-12

转换为(开始日期、结束日期)条目的内部表。当然,这并不是地球上最实用的DSL,但它允许我们探索DSL解析器的逐步实现,而不会陷入太多的细节中。

第一步是为我们的DSL提出一个EBNF语法。

日期列表=日期条目{","日期条目}

日期条目=日期["-"日期]

日期="\d\d\d-\d\d"?-\d\d?"

日期列表为非空,逗号分隔的日期条目列表。

日期条目可以是单个日期,也可以是日期范围。

日期是一个正则表达式,可用于匹配日期字符串。

如果您不熟悉EBNF或类似表单中描述的语法,我建议您在谷歌上搜索一下,看看不同的语法。您选择的描述语法的确切语法并不那么重要。

在以下步骤中,我将使用以下术语:

对于启动和运行DSL,请查看我的DSL toolkit GitHub存储库的source文件夹中的include source code In ZDSLTK\u CORE\u 1.abap。在测试系统中创建include并为即将到来的实现创建报告。在报告中,include ZDSLTK\u CORE\u 1.

我们将在以下步骤中讨论include中的本地类。

include ZDSLTK\u CORE\u 1包含节点类lcl\u node的定义。每个节点都有一个令牌类型ID(属性mv\u token\u ID)。令牌类型取决于具体的DSL。在本例中,我们需要日期列表、日期条目和日期(非)终端的令牌类型标识。

因此,我创建了lcl\U节点的子类lcl\U日期节点,并定义如下常量:

类lcl\U日期节点定义继承自lcl\U节点。

公共部分。

常量:gc\U令牌类型的开始,

date_list TYPE lif_dsltk_types=>mvt_token_id VALUE 1,

date_entry TYPE lif_dsltk_types=>mvt_token_id VALUE 2,

date TYPE lif_dsltk_types=>mvt_token_id VALUE 3,实时大数据,

结束gc_token_TYPE。

ENDCLASS.

规则是:为语法的每个非终端和每个命名终端创建自己的令牌类型。

我们的小型DSL工具箱包含一个抽象解析器类lcl\u parser。在下面的所有步骤中,我们将创建一个具体的子类,它实现我们的解析逻辑。

创建一个子类lcl\u parser of lcl\u parser。重新定义受保护的方法解析\u输入并使用空实现创建\u节点。

现在实现创建\u节点以返回lcl \u日期\u节点的新实例,将所有参数传递给构造函数。create\u node用作节点对象的工厂方法。因为我们既没有重新定义任何方法,也没有在自己的子类中添加任何成员属性,所以在本例中这有点蹩脚。

在这一步之后,我的解析器类看起来是这样的:

类lcl\U日期\U解析器定义继承自lcl\U解析器。

受保护部分。

方法:parse\U输入重新定义,

创建\节点重新定义。

ENDCLASS.

CLASS lcl \ u dates \解析程序实现。

METHOD parse \ u input.

ENDMETHOD.

METHOD create \ u node.

ro \ u node=NEW lcl \ u dates \ u node(

iv \ u token \ u id=iv \ u token \ u id

iv \ u token=iv \ u token

is \ u code \ u pos=is \ u code \ u pos.

ENDMETHOD.

ENDCLASS.

解析程序类lcl \ u parser提供受保护的方法read\u令牌,我们将使用它为我们的终端令牌创建单个read\u…方法。

步骤5.1:为每个未命名的终端X创建一个新的私有方法read\u X,在解析器类中不带参数,但delcare lcx\u解析是例外。通过使用正则表达式调用read\u token来实现该方法,该正则表达式将用于匹配未命名的终端。

步骤5.2:为每个命名的终端Y在解析器类中创建一个新的私有方法read\u Y,该方法返回一个lcl\u node对象并可能引发lcx\u解析。通过使用以下参数调用read\u token来实现该方法:

–iv\u regex=用于匹配令牌的正则表达式,包括(…)中包含的正则表达式部分,以提取令牌文本

–iv_token_id=应用于创建的节点对象的令牌id

–iv_token_text=应用于实例化lcx_解析的文本,以防请求的令牌无法解析

对于我们的日期解析器,如下所示:

类lcl\U日期\U解析器定义继承自lcl\U解析器。

私有部分。

方法:

读取逗号引发lcx\U解析,

读取破折号引发lcx\U解析,

读取日期返回值(ro\U节点)类型mrt\U节点引发lcx\U解析。

结束类。

类lcl\U日期\U解析器实现。

方法读取逗号。

读取\U令牌(',').

ENDMETHOD.

METHOD read \u dash.

read \u token('-').

ENDMETHOD.

METHOD read \u date.

ro \u node=read \u token(

iv \u regex='(\d\d\d-\d\d?)?-\d\d?)"

iv_token_id=lcl_dates_node=>gc_token_type-date

iv_token_text='date')。

ENDMETHOD.

ENDCLASS.

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

关于我们 | 版权声明 | 广告服务 | 友情链接 | 联系我们 | 网站地图

Copyright © 2002-2020 sook云 版权所有 备案号:豫ICP备36548666号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。