[英]Regex pattern to match switch statements C++
我正在尝试编写一个用于bash脚本的正则表达式模式,该脚本检查switch
语句(C ++)的语法。
我要遵循的switch
语句的语法如下。
switch(expression)
{
case constant-expression:
statement(s);
break; // must be present
case constant-expression:
statement(s);
break; // must be present
....
....
default : // must be present
statement(s);
break; // must be present
}
请注意,即使不是必须要使用break
和default
语句,我还是要检查它们的存在。
我已经编写了此正则表达式模式来匹配开关块。
switch(.*?)\\n(\\s)*?{(\\n(.*?))*?(\\n(\\s)*case(.*?):?(\\n(.*?))*?break;)+(\\n(.*?))*?\\n(\\s)*(default:)?(\\n(\\s)*)*(break|return(.*?))?;(\\n(\\s)*(.*?))*}
它可以成功地匹配开关块,但是问题是, 即使缺少break和default语句 ,它也可以匹配switch
块。 我尝试将+
运算符与break
和default
单词一起使用,但它们似乎不起作用。
编辑更新:
是否可以使用解析器来匹配诸如以下的开关块?
switch (PC_INT[address.port][address.pin])
{
#if defined (__AVR_ATmega2560__) || defined(__AVR_AT90CAN128__)
case EINT_0:
// Mask the interrupt so it doesn't fire anymore, i.e put a zero in the mask register.
EIMSK &= ~(1 << INT0);
break;
case EINT_1:
EIMSK &= ~(1 << INT1);
break;
....
default:
return GPIO_INT_OUT_OF_RANGE;
#elif defined(__AVR_ATmega64M1__) || defined(__AVR_ATmega64C1__)
case EINT_0:
// Mask the interrupt so it doesn't fire anymore, i.e put a zero in the mask register.
EIMSK &= ~(1 << INT0);
break;
case EINT_1:
EIMSK &= ~(1 << INT1);
break;
....
default:
return GPIO_INT_OUT_OF_RANGE;
#else
#error "GPIO interrupts not implemented for this configuration."
#endif
}
非贪婪模式(例如.*?
)不是魔术。
您显然希望.*?
在(\\<case:.*?\\<break;\\s*)+
(正则表达式的简化形式)中不匹配case:
。 为什么不呢? 换句话说,文本为:
case 1:
do_something();
case 2:
do_something_else();
break;
当然匹配case.*?break;
; .*?
符合1: do_something(); case 2: do_something_else();
1: do_something(); case 2: do_something_else();
。
.*?
也不是栅栏。 case.*?break(more)
可能不匹配case
之后的第一个break
,如果(more)
与第一个break
的文本不匹配,但与第二个break
的文本匹配。
至于default:
显然是可选的,这正是您的正则表达式所说的:
(default:)?
我认为正则表达式不是可修复的。 您无法使用正则表达式解析C或C ++。
您确实需要使用更好的解析基础结构。 您可以使用flex
和bison
构建一个简单的解析器,该解析器适用于无法与预处理器玩游戏的源代码,但是最好使用真正的C ++解析库(如libclang
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.