【问题标题】:Scons for COBOLCOBOL 的 Scons
【发布时间】:2021-10-02 17:19:45
【问题描述】:

我想在 scons 中使用 COBOL 创建一个构建器。

这是一个开始:

import re

Import('env')

# Source:
# src/cpy/COPYBK1.cpy
# src/cpy/COPYBK2.cpy
# src/cpy/COPYBK3.cpy
# src/bat/PROG1.cbl
# src/bat/PROG2.cbl
# These commands would run:
# cobc -o lib/PROG1.so -Isrc/cpy src/cbl/PROG1.cbl
# cobc -o lib/PROG2.so -Isrc/cpy src/cbl/PROG2.cbl
#     +-.
#       +-SConstruct
#       +-PROG1.cbl
#       +-PROG1.so
#       | +-PROG1.cbl
#       | +-COPYBK1.cpy
#       | +-COPYBK2.cpy
#       +-PROG2.cbl
#       +-PROG2.so
#       | +-PROG2.cbl
#       | +-COPYBK1.cpy
#       | +-COPYBK3.cpy
#
# Also, PROG2 is called from PROG1 so lib/PROG2.so target should be automatically generated.
# PROG2 is dynamically loaded so it does not need to linked into PROG1 target.

"""
def getCalls(fullprogrampath):
    # This needs to be modified to support multiple lines.
    # This needs to be modified to support nested COPY.
    theregex = r'^......]\s*CALL\s*([A-Z0-9]*)\.$'
    calllist = []

    with open(fullprogrampath, 'r') as f:
        linenum = 0
        for line in f.readlines():
            linenum += 1
            line = line.rstrip()
            m = re.match(theregex, line, re.I)
            if m:
                calllist.append(m.group(1))

    return(calllist)
"""

def getCopyBooks(fullprogrampath):
    # This needs to be modified to support multiple lines.
    # This needs to be modified to support nested COPY.
    theregex = r'^...... \s*COPY\s*([A-Z0-9]*)\.$'
    copybooklist = []

    with open(fullprogrampath, 'r') as f:
        linenum = 0
        for line in f.readlines():
            linenum += 1
            line = line.rstrip()
            m = re.match(theregex, line, re.I)
            if m:
                copybooklist.append(m.group(1))

    return(copybooklist)

bld = Builder(action = 'cobc -o $TARGET -Icpy $SOURCE')
env.Append(BUILDERS = {'CobolProgram': bld})

env.CobolProgram('lib/PROG1.so', 'bat/PROG1.cbl')
env.Depends(target = 'lib/PROG1.so', dependency = getCopyBooks('bat/PROG1.cbl'))

env.CobolProgram('lib/PROG2.so', 'cbl/PROG2.cbl')
env.Depends(target = 'lib/PROG2.so', dependency = getCopyBooks('cbl/PROG2.cbl'))

实际运行

这里是需要补充的:

  1. 缓存字帖扫描,以便我们仅在文件更改时扫描字帖。 Scons 似乎对 C 文件这样做,所以它一定是可能的。
  2. 检测调用语句并添加目标。在 C 中没有类似的东西。

A.我该怎么做?

B.是否有一些我可以查看的示例构建器可以用来建模?

我承认 COBOL 难以扫描,而且它仅限于 COBOL 的格式化程度。将由 COBOL 的开发人员为他们的字帖和未检测到的调用语句添加 Depends 调用。

【问题讨论】:

  • 仅供参考:在处理“嵌套”(或包含)程序(COBOL 85 及更高版本)时,将出现CALL literal 语句。其中一些CALL 语句将引用包含的程序。此外,CALL 语句是否引用这样的包含程序,取决于包含程序的范围。所有program-names 对于最外面的包含程序必须是唯一的,但对于其他程序不必是唯一的。在某些情况下,相同编码的CALL literals 可能指的是两个不同的程序。

标签: cobol scons gnucobol


【解决方案1】:

在一般情况下,您无法使用正则表达式可靠地找到 COBOL 调用的目标。您可以使用一些 COBOL 语法来生成解析器,以帮助您编写应用程序来计算 CALL 和 COPY,但这是一项非常重要的练习。

考虑...

01  Work-Areas.
    05  Program1     PIC X(008) Value Low-Values.
        88  Name-Validate       Value 'N8675309'.
        88  Addr-Validate       Value 'A2718281'.
        88  Date-Validate       Value 'D3141592'.

[...]

    Set Addr-Validate To True
    Call Program1 Using [...]
    Set Date-Validate To True
    Call Program1 Using [...]
    Move 'X' To Program1(1:1)
    Call Program1 Using [...]

...请注意,代码甚至不是病态的,就像这样...

    Identification Division.
    Program-ID. CRAIS.
    Data Division.
    Working-Storage Section.

    01                                                              C
   -                                                                O
   -                                                                N
   -                                                                S
   -                                                                T
   -                                                                A
   -                                                                N
   -                                                                T
   -                                                               S.
        05                                                          P
   -                                                                G
   -                                                                M
                                                                    P
   -                                                                I
   -                                                                C
                                                                    X
   -                                                                (
   -                                                                8
   -                                                                )
                                                                    V
   -                                                                A
   -                                                                L
   -                                                                U
   -                                                                E
                                                                   'B
   -                                                               'R
   -                                                               'A
   -                                                               'C
   -                                                              'A'
        .
    Procedure Division.
                                                                    C
   -                                                                A
   -                                                                L
   -                                                                L
                                                                    P
   -                                                                G
   -                                                                M
                                                                    G
   -                                                                O
   -                                                                B
   -                                                                A
   -                                                                C
   -                                                                K
        .

COBOL COPY 语句也可以像上面讨厌的 CALL 一样继续。

【讨论】:

  • 非常感谢此评论,但我的解决方案不需要涵盖所有情况。只是我知道代码是“干净”的情况。如果这行得通,那么我可能会继续处理更多的边缘情况,但正如您指出的那样,程序员编写动态调用时几乎没有希望。
  • 如果我需要严格的解析,我会考虑向 GnuCOBOL 编译器添加一个选项,该选项将执行严格的解析并输出 CALL 程序和 COPYBOOK。
  • 要考虑的两件事:您还可以CALL 程序指针并具有用户定义的函数(“命名”和再次使用函数指针)。关于对 GnuCOBOL 的添加:在 GnuCOBOL 1.1 中有一个依赖生成(-MT 和朋友) - 它们在 2.x 中被删除。我不知道他们是否曾经工作过,但让他们再次工作会非常好(即使这些与make 相关,他们也可以很容易地重新解析以与 scons 一起使用)。旁注:在调用变量时,可以使用生成的列表 + 外部参照来查找常量的 CALL 和 SET/MOVE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
相关资源
最近更新 更多