对于那些在词法分析和解析方面的专家......我正在尝试用 perl 编写一系列程序,这些程序将解析 IBM 大型机 z/OS JCL 用于各种目的,但在方法论上遇到了障碍。我主要遵循 Mark Jason Dominus 在“Higher Order Perl”中提出的词法/解析思想,但有些事情我不太清楚该怎么做。
JCL 有所谓的内联数据,它与“here”文档非常相似。我不太确定如何将这些转换为令牌。
内联数据的布局如下:
//DDNAME DD *
this is the inline data
this is some more inline data
/*
...
按照惯例,“DD”后面的“*”表示以下行是内联数据本身,以“/*”或下一个有效的 JCL 记录(前 2 列中的“//”开头)终止。
更高级的是,内联数据可能如下所示:
//DDNAME DD *,DLM=ZZ
//THIS LOOKS LIKE JCL BUT IT'S ACTUALLY DATA
//MORE DATA MASQUERADING AS JCL
ZZ
...
有时,内联数据本身就是 JCL(可能被泵送到程序或内部阅读器,等等)。
但这就是问题所在。在 JCL 中,记录为 80 字节,长度固定。第 72 列(第 73-80 列)之后的所有内容都是“评论”。同样,在有效 JCL 之后的空白之后的所有内容同样是注释。由于我希望在我的程序中操作 JCL 并将其吐出,我想捕获评论以便我可以保留它们。
因此,这是内联数据情况下的内联注释示例:
//DDNAME DD *,DLM=ZZ THIS IS A COMMENT COL73DAT
data
...
ZZ
...more JCL
我最初认为我可以让我最顶层的词法分析器拉入一行 JCL 并立即为 cols 1-72 创建一个非标记,然后为第 73 列评论创建一个标记 (['COL73COMMENT',$1]),如果任何。然后,这会将 cols 1-72 文本后跟 col73 令牌的字符串向下传递给下一个迭代器/标记器。
但是,我将如何从那里获取内联数据?我最初认为最顶层的标记器可以查找“DD \*(,DLM=(\S*))”(或类似的),然后继续从馈送迭代器中提取记录,直到它到达分隔符或有效的 JCL 启动器 ("//")。
但是您可能会在这里看到问题……我不能有 2 个最顶层的标记器……查找 COL73 注释的标记器必须位于顶部,或者获取内联数据的标记器必须位于顶部。
我想 perl 解析器也有同样的挑战,因为看到
<<DELIM
不一定是行尾,后面是这里的文档数据。毕竟,你可以看到 perl 像:
my $this=$obj->ingest(<<DELIM)->reformat();
inline here document data
more data
DELIM
标记器/解析器如何知道标记“)->reformat();” 然后仍然按原样抓取以下记录?对于内联 JCL 数据,这些行按原样传递,在这种情况下,第 73-80 列不是注释...
那么,有没有人接受这个?我知道会有很多问题澄清我的需求,我很乐意尽可能多地澄清。
在此先感谢您的帮助...