Как мне лучше сделать сбалансированное цитирование с помощью Perl Regexp::Grammars?

Используя 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 ответа

Решение

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

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 переопределяет обычный Семантика "return result-hash" возвращает только то, что создает соответствующий подправил (т.е.).

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

Другие вопросы по тегам