首页
学习
活动
专区
圈层
工具
发布

COBOL
EN

Stack Overflow用户
提问于 2021-10-02 17:19:45
回答 1查看 89关注 0票数 2

我想用COBOL在scons中创建一个生成器。

以下是一个开始:

代码语言:javascript
复制
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. 缓存对文案的扫描,以便我们只在文件发生更改时才扫描抄写本。Scon似乎对C文件这样做,所以它必须是possible.
  2. Detect调用语句并添加目标。在C.

中没有类似的说法。

我该怎么做呢?

有什么样例建设者我可以看看,我可以建模吗?

我承认COBOL是很难扫描的,它将仅限于COBOL的格式化有多疯狂。将由COBOL的开发人员为其未检测到的复制簿和调用语句添加Depends调用。

EN

回答 1

Stack Overflow用户

发布于 2021-10-02 22:44:07

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

想想..。

代码语言:javascript
复制
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 [...]

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

代码语言:javascript
复制
    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复制语句也可以像上面的讨厌调用那样继续下去。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69418646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档