我是一个正则表达式的新手,我尝试写一个C#应用程序,将所有旧的C++文件转换为static_cast风格。
例如:
(void)memcpy(&a[0],(void * )hihi, (UBYTE) V_SIZE);
(void) memcpy((VOID*)abc, (const VOID*) dafa, (uint8)NUMBER_SIZE);
(void )memcpy(
(void *)p,
&abc, (uint8)DATE_SIZE);
我想他们都应该
static_cast<void>(memcpy(&a[0], static_cast<void * >(hihi), static_cast<UBYTE>( V_SIZE)));
static_cast<void> memcpy(static_cast<VOID*>(abc), static_cast<const VOID*> (hihi), static_cast<uint8>(NUMBER_SIZE));
static_cast<void >memcpy(
static_cast<void *>(p),
&abc, static_cast<uint8>(DATE_SIZE));
我也在调查和尝试这一个
List<string> castTypeList = new List<string>
{"void", "void *", "UBYTE", "uint8", "VOID*", "uint8" };
// Fix qacpp-4.7.0-3080 This expression uses old style casts
// Only apply for cpp source file (.cpp)
if ((Path.GetExtension(sourceFile) == ".cpp"))
{
foreach (string e in castTypeList)
{
File.WriteAllText(sourceFile, Regex.Replace(
File.ReadAllText(sourceFile),
@"\(" + e + @"\)([^):;\r\n},]*)",
"static_cast<" + e + @">($1)"));
}
}
结果看起来不错,但并不完美,有些字符串无法匹配和替换(你可以看到下图)。有没有更好的解决方案或更好的想法来处理它?
3条答案
按热度按时间pobjuy321#
您可以使用以下模式进行匹配和替换,直到找不到匹配项:
请参见regex demo。
在C#中,您可以使用
参见C# demo。输出:
q3qa4bjr2#
我终于自己找到了解决办法。
我将正则表达式分成两部分。第一部分(第一个for循环)将匹配函数的类型转换。在第一个for循环完成后,函数的所有类型转换都应该像下面这样替换
第2部分(第二个for循环)将匹配变量的类型转换,并替换所有其余部分,如下所示
它不是完美的100%,但我尝试与许多源文件,它看起来不错,它可以匹配高达99%:))
hsvhsicv3#
可靠地匹配旧式类型转换对于正则表达式来说是不可能的,因为你不能确定什么是类型,什么不是。作为证明,考虑下面这个C++文件:
如果
something
是一个类型,那么它所在的行是一个类型转换,但如果它是一个变量,那么它就不是。同样,如果somethingelse
是一个类型,那么它所在的行是一个类型转换,但如果它是一个函数,那么它就不是。https://en.wikipedia.org/wiki/Lexer_hack要真正强调这一点,请考虑另一个C++文件:
现在应该很清楚,知道这些东西是否是强制转换的唯一方法是首先计算任意的
constexpr
表达式which are Turing-complete。