2017-11-10 8 views
3

how to pass regexes as argumentsを学習した後、subを使用して最初の正規表現を構築しようとしましたが、もう一度スタックしました。以下の複雑なルールには申し訳ありませんが、私はそれらを単純化するために全力を尽くしました。私は少なくともこの問題に近づくための手がかりが必要です。Perlでsubを使った正規表現を構築する

regexleftrightはペアで来るべきであるとmiddleの変異体が選択されるrightに依存交番、leftmiddlerightからなるそれらの各々で構成すべきです。

Pairsのアレイはleftrightのペアを含む:

my Pair @leftright = 
    A => 'a', 
    ... 
    Z => 'z', 
    ; 

Middle変異体は、ハッシュから読み出される:rightzある場合

my Regex %middle = 
    z =>/foo /, 
    a =>/bar /, 
    m =>/twi /, 
    r =>/bin /, 
    ... 
    ; 

%middle<z>%middle<a>、選択されるべきである - right場合aなど

したがって、得られた正規表現は

my token word { 
    | A <%middle[a]> a 
    | Z <%middle[z]> z 
    | ... 
} 

または、より一般的

my token word { 
    | <[email protected][0].key> 
     <middle=%middle{@leftright[0].value}> 
     <[email protected][0].value> 
    | (the same for index == 1) 
    | (the same for index == 2) 
    | (the same for index == 3) 
... 
} 

であるべきであり、それはAbaraZfoozと一致すべきです。 、@leftrightからすべてのペアを取るrightの値に応じて、適切な%middle{}を配置し、1 regexにそれをすべて結合しますsubと(grammarに例えば使用することができます)token wordを構築する方法

my Regex sub sub_word(Pair @l_r, Regex %m) { 
... 
} 
my token word { 
    <{sub_word(@leftright, %middle)}> 
} 

は、私がleftmiddle、およびrightの値を知っておく必要が試合後:

"Abara" ~~ &word; 
say join '|', $<left>, $<middle>, $<right> # A|bar|a 
+0

を見ます、中間は '/ waldo /'です。しかし、あなたは 'X'と' waldo'の間でどのようなプログラム的関係が検出されていると言われていません。( '/ zfoo /'の 'z'は'/zfoo/'ではなく、'/waldo/'ではなく' z'を書きましたが、違いはありません。あなたのプログラムが '/ zfoo /'パターンに '/ zfoo /'が含まれていることを内在的に知ることはできないと思います。 'z') – raiph

+0

トークン' word'を構築すべきサブパラメータの入力パラメータは何でしょうか?正規表現解析が定義済みの 'token'を構築する前にsubを使うべきでしょうか、それとも正規表現パーサ内で使うべきでしょうか?簡単な例がありますか? –

+0

@raiphありがとうそれは私のせいだ(と私はそれについて考えた)、私は '正規表現'へのイントロスペクションを意味しませんでした。私はこの部分を再フォーマットし、ハッシュを作成します。 –

答えて

2

私はまだtokenを使用して、これを行うことができませんでしたが、ここでEVALとソリューションであり、 Regex(また、%middleStrのハッシュとして使用しており、Regexのハッシュではありません)

出力:私はEVALを使用することを選んだ理由の詳細については

rx/$<left>='A' $<middle>='bar' $<right>='a'|$<left>='Z' $<middle>='foo' $<right>='z'/ 
「Abara」 
left => 「A」 
middle => 「bar」 
right => 「a」 

、あなたは 'X'だ権利を与え、効果に何かを言っているようですねHow can I interpolate a variable into a Perl 6 regex?

+0

ありがとう!おそらく、これが最も効果的な方法ですが、私の場合は '$ /'を分析する必要があります。例えば。私はどの「中間」がマッチしているか知る必要がある。これをQに追加します。申し訳ありませんが、私はあらかじめそれを書いていません。 –

+1

次に、中間部分の周りにキャプチャグループを置くことができますか?このように、$ pat = 'rx/'A'( 'bar') 'a' | 'Z'( 'foo') 'z' /'それで '$ 0'はマッチが成功した後に中間部分を含むでしょう。 –

+0

名前付き(ポジショニングではない)キャプチャでも同じことができますか?それは私にとって非常に素晴らしい解決策になるでしょう。 –

関連する問題