我想在 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'))
实际上运行的是
这是需要添加的内容:
- 缓存抄写本的扫描,以便我们仅在文件发生更改时才扫描抄写本。 Scons 似乎对 C 文件执行此操作,因此它一定是可能的。
- 检测调用语句并添加目标。 C 中没有类似的例子。
答:我该怎么做?
B. 是否有一些示例构建器可供我查看并进行建模?
我承认 COBOL 很难扫描,并且它会受到 COBOL 格式的疯狂程度的限制。这将由 COBOL 的开发人员添加Depends
要求他们的字帖和未检测到的要求声明。
在一般情况下,您无法使用正则表达式可靠地找到 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 一样继续。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)