2016-03-07 4 views
5

Я не могу найти официальную ссылку для правил приоритета для Perl regular expressions. Я могу найти только Know the precedence of regular expression operators. Однако это не официальная ссылка, указанная perldoc.Каковы правила приоритета регулярных выражений Perl?

+0

perlre содержит раздел * Версии 8 Регулярные выражения *, которая предоставляет словесное описание шаблона регулярного выражения сопоставления механизмов. – laune

+0

@laune, я только что просмотрел _Version 8 Regular Expressions_. Но я не могу найти ничего, что имеет отношение к приоритету. Не могли бы вы указать, как это имеет отношение к приоритету? –

+2

Я думаю, что этот текст разъясняет проблему, но вам, возможно, придется прочитать (немного) между строками. Во всяком случае, никогда не было сомнений в приоритете круглых скобок, квантификаторов, сопоставлений и альтернатив в любой из регулярных систем (ранних) * nix-утилит, awk, Perl4, Perl5, Java, XML Schema и многих других. - Что тебя беспокоит?? – laune

ответ

4

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

Это проще передать информацию, которую вы ищете, используя следующие операторы:

  • Кванторы изменить один атом.
  • Модификаторы квантификаторов изменяют один квантификатор.
  • Чередование без ограничений, за исключением парен, в котором они проживают.

Вышеуказанная информация передается так или иначе в perlretut.


При этом можно построить таблицу приоритетов. Поскольку приведенные выше утверждения передают всю необходимую информацию, из них можно построить таблицу приоритетов. Это следующее:

  1. атомов (например a, \n, \^, ., ^, \w, [...], \1, (...))
  2. Постфикс Унарный операторы (квантификаторы и модификаторы кванторные)
  3. Неявные «, а затем по "оператору между (возможно, количественно) атомами
  4. Чередование

Это соответствует диаграмме на странице, на которую вы ссылались.


Для удовольствия, нижеприведенный быть BNF:

pattern    ::= <alternation> 

alternation   ::= <sequence> <alternation2> 
alternation2   ::= "|" <alternation> | "" 

sequence    ::= <quantified_atom> <sequence> | "" 

quantified_atom  ::= <atom> <quantified_atom2> 
quantified_atom2  ::= <modified_quantifier> | "" 
modified_quantifier ::= <quantifier> <modified_quantifier2> 
modified_quantifier2 ::= <quantifier_modifier> | "" 
+0

Вам не нужно было, это было здорово уже :) – Aaron

Смежные вопросы