繁体   English   中英

正则表达式模式以匹配开关语句C ++

[英]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
}

请注意,即使不是必须要使用breakdefault语句,我还是要检查它们的存在。

我已经编写了此正则表达式模式来匹配开关块。

switch(.*?)\\n(\\s)*?{(\\n(.*?))*?(\\n(\\s)*case(.*?):?(\\n(.*?))*?break;)+(\\n(.*?))*?\\n(\\s)*(default:)?(\\n(\\s)*)*(break|return(.*?))?;(\\n(\\s)*(.*?))*}

它可以成功地匹配开关块,但是问题是, 即使缺少break和default语句 ,它也可以匹配switch块。 我尝试将+运算符与breakdefault单词一起使用,但它们似乎不起作用。

编辑更新:

是否可以使用解析器来匹配诸如以下的开关块?

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 ++。

您确实需要使用更好的解析基础结构。 您可以使用flexbison构建一个简单的解析器,该解析器适用于无法与预处理器玩游戏的源代码,但是最好使用真正的C ++解析库(如libclang

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM