Шаблон регулярного выражения для соответствия операторам Switch Case - PullRequest
0 голосов
/ 26 мая 2009

Нам нужно идентифицировать и затем обработать операторы switch / case в коде на основе некоторых бизнес-правил.

Типичная инструкция переключения:

switch (a)<br /> { <br /> case "A": <br /> case "B": <br /> result = "T"; <br /> result1 = "F";<br /> default: result = "F";<br /> }

Мне удалось создать два шаблона, которые соответствуют телу переключателя на первом шаге и меткам корпуса и телу на втором шаге, однако я ищу одно регулярное выражение, которое позволило бы мне извлечь метки и тела регистра.

У нас нет вложенных переключателей.

С уважением,

Ответы [ 3 ]

3 голосов
/ 26 мая 2009

Поскольку операторы switch могут быть вложенными, традиционные регулярные выражения не могут их обработать (черт, даже тот факт, что {} может быть вложенным, нарушает их). Регулярные выражения могут анализировать только Обычные языки . Вам нужен какой-то синтаксический анализатор для анализа языков, которые не являются регулярными. В зависимости от того, какой у вас язык (он выглядит как C, но так много всего), может уже существовать парсер, который вы можете использовать (например, Sparse для C).

1 голос
/ 26 мая 2009

Здесь можно начать с чего-то, но оно далеко от совершенства - выражение не распознает значения по умолчанию и конец оператора switch (и, возможно, включает некоторые другие ошибки).

(?sn:(case (?<label>[^:]+):[ \r\n\t]*)+(?<body>((?!case).)*))

UPDATE

Также произойдет сбой, если тело содержит case как часть строки или идентификатор.

0 голосов
/ 26 мая 2009

Чес. Оуэнс прав в своем комментарии. Но для простых случаев вы можете использовать следующее регулярное выражение:

switch\s*\((?<expression>[^\)]+)\)\s*\{\s*((default(?<case>)|case\s*(?<case>"[^"]*"|'[^']*'|\w+))\s*:\s*(?<body>((?!\s*(case\b|default\b|\}))("[^"]*"|'[^']*'|[^\}]))*)\s*)+\}

Чтобы использовать его, движок регулярных выражений, который вы используете, должен поддерживать явные множественные именованные захваты и упреждения (например, движок регулярных выражений .NET). Обратите внимание, что все группы, кроме названных групп, могут быть сделаны без захвата, но для того, чтобы упростить понимание регулярного выражения, я не добавил "?:" В начале группы, чтобы сделать их группами без захвата. *

Затем вы получите одно совпадение для каждого распознанного оператора switch со следующими захватами:

  • выражение: выражение, используемое для коммутатора (1 захват)

  • case: метка регистра или пусто (но успешный захват) для значения по умолчанию

  • body: корпус, по одному на каждый кейс

регистр и тело всегда будут приходить парами, так что вы можете перечислять их по снимкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...