パターンが思うように動作しないときは、Log()を使って、マッチしている部分をJMPログに出力してください。次の例は、パターンマッチングをデバッグし、スクリプトを書き換えて、「the quick brown fox」というフレーズの単語間の空白を考慮する方法を示しています。
// 空白を除く1つ以上の文字の貪欲なマッチ
word = Pat Repeat( Pat Not Any( " " ) );
Pat Match(
"the quick brown fox",
word >> a +
word >> b +
word >> c +
word >> d
);
Show( a, b, c, d );
a = "qu";
b = "i";
c = "c";
d = "k";
パターンwordの内容を考えれば、出力はおそらくあなたが望むものではないでしょう。パターン内の単語はどれも一致しませんでした。
Show( a, b, c, d )の式は、最初の良いステップになります。それを見てもJMPがどのようにその答えを得たかがわからない場合は、Log()を以下のように挿入してみてください。
word = Pat Repeat( Pat Not Any( " " ) );
Pat Match(
"the quick brown fox",
(word >> a) >> Log( "a" ) +
(word >> b) >> Log( "b" ) +
(word >> c) >> Log( "c" ) +
(word >> d) >> Log( "d" )
);
Show( a, b, c, d );
0(a) the(数値0はマッチした位置)
0(a) th(「a」はログに与えた任意の識別子)
2(b) e
...
4(a) quick
4(a) quic
...
この情報により、マッチの仕組み、少なくとも最初に単語パターンがどのように単語にマッチするかを理解できます。しかし、その後、次の単語パターンが空白以外の文字と一致するように、後退してより小さな部分とマッチしようとします。ただし、このパターンは単語間の空白にはマッチしません。そして、実際に空白以外の文字からなる4つの連続した語を見つけました。次のスクリプトのほうがよさそうです。
word = Pat Repeat( Pat Not Any( " " ) );
gap = Pat Repeat( Pat Any( " " ), 1, 999, GREEDY );
Pat Match(
"the quick brown fox",
word >> a + gap +
word >> b + gap +
word >> c + gap +
word >> d
);
Show( a, b, c, d );
a = "the";
b = "quick"
c = "brown";
d = "fox";