在 VS2012 中伪造原始字符串?
Faking raw strings in VS2012?
在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
,然后将其添加到预构建步骤中。
在 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)
在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
,然后将其添加到预构建步骤中。
在 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)