Как мне лучше использовать сбалансированное цитирование с помощью Perl Regexp :: Grammars? - PullRequest
2 голосов
/ 15 июня 2010

Используя Regexp :: Grammars Дамиана Конвея, я пытаюсь сопоставить различные механизмы сбалансированного цитирования ('foo', "foo", но не 'foo") - такие как парены, кавычки,двойные кавычки и двойные доллары.Это код, который я сейчас использую.

<token: pair>        \'<literal>\'|\"<literal>\"|\$\$<literal>\$\$
<token: literal>    [\S]+

Обычно он работает нормально и позволяет мне сказать что-то вроде:

<rule: quote>            QUOTE <.as>? <pair>

Мой вопрос: как мне изменить вывод,чтобы исключить обозначение игл для токена pair?

{
  '' => 'QUOTE AS \',\'',
  'quote' => {
               '' => 'QUOTE AS \',\'',
               'pair' => {
                           'literal' => ',',
                           '' => '\',\''
                         }
             }
},

Здесь, очевидно, нет никакого желания иметь pair между, кавычкой и значением literal.Есть ли лучший способ сопоставить 'foo', "foo" и $$foo$$, а может быть, иногда ( foo ), не создавая каждый раз ненужный токен pair?Могу ли я предварительно обработать этот токен или сложить его в вышеприведенное?Или напишите лучшую конструкцию, полностью исключающую необходимость в ней?

Ответы [ 2 ]

3 голосов
/ 16 июня 2010

Согласно Дамиану, ответ был на самом деле в «Ручной дистилляции результатов» в части документов

The correct answer is to tell your <pair> token
to pass the result of each <literal> subrule through as its own
result, using the MATCH=
alias (see: "Manual result distillation" in the module documentation)  like so:

   <token: pair>        \'<MATCH=literal>\' | \"<MATCH=literal>\" |
\$\$<MATCH=literal>\$\$

Вот что говорят документы:

Regexp :: Grammars также предлагает полное ручное управление процессом дистилляции.Если вы используете зарезервированное слово MATCH в качестве псевдонима для вызова подправления [...] Обратите внимание, что во втором случае, хотя и захвачены в хеш-результат, они не возвращаются, поскольку псевдоним MATCH переопределяет обычныйСемантика «вернуть хеш-результат» и возвращает только то, что производит связанный с ней подправил (т.е.).

0 голосов
/ 15 июня 2010

Используйте другой замечательный модуль Дамиана, Text :: Balanced .

...