【问题标题】:Faking raw strings in VS2012?在 VS2012 中伪造原始字符串?
【发布时间】:2015-02-03 15:32:09
【问题描述】:

在 VS2012 中是否有任何方便的方法来伪造原始字符串? (我正在考虑使用预处理器宏,但愿意接受建议。)

我的用例是一个相当长但静态的正则表达式列表,所有转义的\ 几乎都无法阅读。

替代代码如下:

p[TokenType::Comment       ] = "(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)";
p[TokenType::Float         ] = "[0-9]+\\.[0-9^(A-Za-z)]*";
p[TokenType::Integer       ] = "[0-9]+";
p[TokenType::String        ] = "\\\"([^\\\"\\\\\\\\]|\\\\\\\\.)*\\\"";
p[TokenType::Identifier    ] = "[a-zA-Z_][a-zA-Z0-9_]*";
p[TokenType::Operator      ] = "\\^|\\*|\\/|\\+|\\-|\\=";
p[TokenType::BinaryOperator] = "(\\=\\=)|(\\+\\=)|(\\-\\=)|(\\*\\=)|(\\/\\=)";
p[TokenType::WhiteSpace    ] = "\\s+";

p[TokenType::EndOfStatement] = ";";
p[TokenType::ListStart     ] = "\\(";
p[TokenType::ListDelimiter ] = "\\,";
p[TokenType::ListEnd       ] = "\\)";
p[TokenType::BlockStart    ] = "\\{";
p[TokenType::BlockEnd      ] = "\\}";

(简直丑陋且难以维护。)

我发现将所有内容放在一个文本文件中并在运行时加载它,但我宁愿不必分发它。建议?

【问题讨论】:

  • 编写一个工具,获取一个文本文件并输出一个带有正确转义的字符串文字的 .cpp 文件,也许?
  • 您至少可以将正则表达式拆分成更小的部分并将它们连接起来。每件作品都可重复使用,更易于查看。

标签: c++ regex string visual-studio-2012


【解决方案1】:

编写一个代码生成器,以简单格式获取输入文件并输出转义的.cpp,然后将其添加到您的预构建步骤中。

在 Python 中,假设输入文件如下:

Comment=(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
Float=[0-9]+\.[0-9^(A-Za-z)]*

整个事情可以归结为:

def c_escape(s):
    result = ''
    for c in s:
        if not (32 <= ord(c) < 127) or c in ('\\', '"'):
            result += '\\%03o' % ord(c)
        else:
            result += c
    return result

import sys
inFile = open(sys.args[1])
outFile = open(sys.args[2], 'w')
for l in inFile:
    idx = l.find('=')
    k,v = l[0:idx], c_escape(l[idx+1:])
    outFile.write('p[TokenType::%s]="%s";\n' % (k, v)

【讨论】:

    【解决方案2】:

    一个简单的答案是:将字符串放入资源中,然后在运行时加载它们。

    【讨论】:

    • 我明确表示我不想分发包含相关模式的文本文件。
    • 资源sre分布在可执行模块内部,因此您不需要分发单独的文本文件。 Visual Studio 包含标准的资源编辑器和编译器,您无需安装任何第三方工具或实用程序(如 Python),也无需为其编写和维护脚本。
    • 这有点特定于平台。我需要这个在 VS2012 中构建,但不是在 VS2012 中独家。 (还有 XCode / clang)。有一些解决方法,但是像代码生成器这样的通用解决方案感觉更便携。 (我没有说它需要跨平台,所以+1)
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多