Требуется регулярное выражение: должно соответствовать следующим шаблонам - PullRequest
1 голос
/ 11 октября 2010

Действительный:

  1. ((int)10)
  2. (int)10
  3. ((char)((x+y)&1))
  4. ((int *)1)

Неверно:

  1. (a-b)
  2. (a&=b)
  3. a
  4. ((a))

Ответы [ 3 ]

8 голосов
/ 11 октября 2010

Язык (сбалансированных) выражений в скобках не является регулярным , т. Е. Вы не можете написать регулярные выражения, соответствующие строкам такого типа.

См. SO вопрос: Почему регулярные выражения называются "регулярными" выражениями и Википедия: Обычные языки .

Вам необходимо работать с более способной техникой анализа, такой как CFGнапример, ANTLR .

Вы можете начать с чего-то вроде:

CastedExpression ::= Cast Expression | LPAR CastedExpression RPAR
Cast             ::= LPAR Type RPAR
Expression       ::= Sum | Product | Litteral | LPAR Expression RPAR | ...
Type             ::= char | int | Type ASTERISK | ...

( Не стесняйтесь редактировать грамматику выше, если вы обнаружите какие-либо очевидные улучшения).

1 голос
/ 12 октября 2010

Это утверждение:

Язык (сбалансированный) выражения в скобках не регулярный, то есть вы не можете написать регулярные выражения, соответствующие этим вид струн.

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

Например, используя третью строку из исходного списка допустимых входных данных, этот код Perl:

my $str = "((char)((x+y)&1))";
my $w   = length length $str ;
my $rx  = qr{ (?<PAREN>
                \(
                   (?:
                       [^()] +
                     |
                       (?&PAREN)
                   ) *
                \)
              )
          }x;

while ($str =~ /(?=$rx)/g) {
    printf "Matched from %*d to %*d: %s%s\n" =>
        $w => pos($str),
        $w => pos($str) + length($+{PAREN})-1,
        " " x pos($str)   =>     $+{PAREN};
}

довольно легко выдает следующий вывод:

Matched from  0 to 16: ((char)((x+y)&1))
Matched from  1 to  6:  (char)
Matched from  7 to 15:        ((x+y)&1)
Matched from  8 to 12:         (x+y)

По исходному набору исходных данных я не могу понять, что делает один действительным, а другой - недействительным. Тем не менее, я уверен, что некоторые разработки кода, который я дал выше, будут работать отлично.

Однако, вам придется написать его на Perl, так как шаблоны Java просто недостаточно мощны. ☹

0 голосов
/ 11 октября 2010

Добавление к ответу aioobe:

Похоже, вы пытаетесь написать синтаксический анализатор выражений. Как уже говорилось в другом ответе, использование регулярного выражения невозможно. Вам следует рассмотреть возможность использования синтаксического анализатора выражений, такого как JEP, или написать его самостоятельно, используя javacc.

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