1

我在 C 中有另一种语言的解释器。我必须将另一种语言的代码(大约 200 行)传递给这个解释器,这里就会出现问题。

char* command_line[] = {
    "", 
    "-e", 
    "print \"Hello from C!\\n\";"
};

此代码通过以下方式解析:

(..)
    parser(my_p, NULL, 3, command_line, (char **)NULL);
(...)

在上面的代码中,我使用数组,但即使是简单的代码也必须在 " ; | \ 等字符之前用 \ 包装。

如何避免这个问题并轻松传递超过 200 行多行代码?

4

4 回答 4

5

如果您使用的是 C++11,则可以使用原始字符串文字。

R"(print "Hello from C!\n";)"

或者您可以简单地将所有数据放入一个外部文件中,然后在开始时读取它。无需在那里转义任何数据。

于 2013-08-21T09:48:13.537 回答
1

您可以使用 C 预处理器为您进行字符串化:

#define STRINGIFY(...) #__VA_ARGS__
#define STRINGIFY_NL(...) #__VA_ARGS__ "\n"

char* command_line[] = {
    "", 
    "-e", 
    STRINGIFY(print "Hello from C!\n";),    //< one element of the array

                                            //< another element of the array
                                            //< with embedded NL
    STRINGIFY_NL(print "Hello from C!")     //< no comma and the next line is glued
    STRINGIFY   ("for a second time";),     //< end of other string
};

唯一要遵守的限制是可能()必须在参数内部保持平衡,STRINGIFY并且您必须将宏放在要转义的每一行上。

于 2013-08-21T10:02:36.207 回答
0

不幸的是,C 中不支持文字字符串或类似的有用结构,因此如果您想在 C 程序中编写解释代码,您必须小心并按照您的说明转义引号和斜杠。

另一种方法是将代码写入文本文件并将其视为外部资源文件。您可以将代码内部的资源文件读入字符串,然后将其传递给parser().

这是否容易取决于您使用的平台。Windows 很好地支持资源文件并将它们嵌入到 .exe 文件中。我相信 gcc 也可以,但我以前没有这样做过。我害怕有点模糊,但我希望它有所帮助。

于 2013-08-21T09:49:35.260 回答
-1

您可以使用脚本将您的文本输入作为一个文件,并将其字符串化(转义双引号和换行符):

#!/usr/bin/env python
import sys

def main(argv = None):

    if argv is None:
        argv = sys.argv

    if len(argv) < 2:
        sys.stderr.write("Usage: stringify.py input.txt [... input.txt]\n")
        sys.exit(1)

    i = 1
    while i < len(argv):
        inname = argv[i]
        firstline = True
        try:
            infile = open(inname, "r")
            for line in infile:
                line = line.replace('"', '\\"').replace('\n', '\\n')
                sys.stdout.write('"{0}"\n'.format(line))
        except IOError, msg:
            sys.stderr.write("exception {0}\n".format(msg))
            return 2
        i = i + 1
    return 0

if __name__ == "__main__":
    sys.exit(main())
于 2013-08-21T09:47:40.150 回答