2

DamianConwayの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

4

2 に答える 2

3

ダミアンによると、答えは実際にはドキュメントの「手動結果蒸留」の部分にありました

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をサブルール呼び出しのエイリアスとして使用する場合[...]この2番目のケースでは、結果ハッシュにキャプチャされても、MATCHエイリアスが通常のエイリアスをオーバーライドするため、返されないことに注意してください。 「結果ハッシュを返す」セマンティクスは、関連するサブルール(つまり)が生成するもののみを返します。

于 2010-06-15T22:07:23.197 に答える
0

ダミアンによる別の素晴らしいモジュール、Text::Balancedを使用してください。

于 2010-06-15T18:11:31.477 に答える