如何在没有输入源文件但是通过管道运行cobc?

Ion*_*zău 14 cobol pipe gnucobol

是否可以在不提供输入文件的情况下执行COBOL代码?我正在使用cobc.

我试图将代码传递给cobc进程:

$ cat my-input.cbl | cobc
cobc: No input files
Run Code Online (Sandbox Code Playgroud)

要编译文件并运行它,我会这样做:

cobc -x di.cbl -o a && ./a
Run Code Online (Sandbox Code Playgroud)

假设我没有文件,我只有代码(可能在变量中,作为字符串),我可以传递给它cobc吗?它会比创建文件然后编译并运行它更好.

在我的例子中,用户输入COBOL程序的源代码,这是一个字符串变量.目前,我将代码保存在一个文件中,我编译它然后执行它.如果cobc支持在stdin中管道代码片段甚至cli选项,并生成二进制文件甚至直接显示结果(不确定这是好还是坏),那将是很好的.例如,node有-p选项:node -p'console.log(1)' - 这将输出1 \nundefined.g ++有这个功能 -

Bri*_*fin 6

昨天不可能,但今天是这样,一旦领导批准变更,我将立即对源树进行更改.

对编译器源的两个小改动 - 可用于指示stdin.

prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing -
-: 1: Warning: PROCEDURE DIVISION header missing - assumed
prompt$ ls -l
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing
prompt$ ./thing
hello
Run Code Online (Sandbox Code Playgroud)

这将适用于任何操作系统,而不仅仅是那些支持/ dev/stdin的操作系统(目前,正如paxdiablo所写,这是一个非常有效的GNU/Linux等选项).

除此之外; cobc已经可以用作POSIX解释器.

#!/usr/local/bin/cobc -xvg
       identification division.
       program-id. SAMPLE.

       procedure division.
       display "scripted" end-display
       goback.

       end program SAMPLE.
Run Code Online (Sandbox Code Playgroud)

prompt$ chmod +x interp.cob
prompt$ ./interp.cob
Run Code Online (Sandbox Code Playgroud)

Command line:   /usr/local/bin/cobc -xvg ./interp.cob 
Preprocessing:  ./interp.cob -> interp.i
Return status:  0
Parsing:        interp.i (./interp.cob)
Return status:  0
Translating:    interp.i -> interp.c (./interp.cob)
Executing:      gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused
                -fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o"
                "interp.c"
Return status:  0
Executing:      gcc -std=gnu99 -Wl,--export-dynamic -o "interp"
                "/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp
                -lncursesw -ldb -ldl
Return status:  0
Run Code Online (Sandbox Code Playgroud)

可悲的是,这只是为了构建.执行需要额外的步骤.

prompt$ ./interp
scripted
Run Code Online (Sandbox Code Playgroud)

"现在运行代码"没有编译器选项,因此将添加-J(固定格式)和-j(自由格式)选项.运行作业,成为-x(创建可执行文件)的新形式,但也将在处理结束时执行二进制文件.然后我们将在POSIX中访问cobc"脚本".目前允许的只是构建,并且运行必须是单独的命令.

并且POSIX hashbang行的固有限制仅限于单个参数,因此-j -free不起作用,也不会-j -Xref等,但在限制范围内,它将允许cobc脚本.

这是对编译器的另一行更改,以及400行选项解析和文档.;-)

应该准备好在几个小时内进行测试.同样,这些更改将需要所有其他编译器维护人员的批准,但我认为没有任何理由不允许改进.两个提交,一个用于 - 作为stdin,而-J -j用于在编译结束时运行作业.