Как мне лучше сделать сбалансированное цитирование с помощью 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.