rparsec での繰り返しと選択
rparsec では文法要素の繰り返しを指定する方法が複数用意されている。
繰り返し
まずは「RParsec の many と many_ の違い」でも解説した many と many_ があり、これで m 回以上の繰り返しを指定できる(正規表現でいう *, +, {n,})。
repeat, repeat_ は m 回以上、最大 n 回の繰り返しを指定できる(正規表現でいえば {m,n})。また、some, some_ では最大 n 回の繰り返しを指定できる(正規表現でいえば {0,n}。実際のところ、some は min 引数に 0 を指定して、repeat を呼び出しているにすぎない)。
なお、メソッド名の最後にあるアンダースコアの有無については、「RParsec の many と many_ の違い」で解説したとおりで、アンダースコアのつかないメソッドはすべての結果を配列で返し、アンダースコアのつくメソッドは最後の結果のみを返す。
選択
正規表現でいうところの選択も用意されている。このためのメソッドは | なので、見た目は正規表現と似通っている。
たとえば、以下のコードは、
number | word
数値、または一般的な識別子を解釈するためのパーサになる。
また、文法要素のグループ化は簡単で、通常の Ruby プログラムと同じく括弧で囲めばよい。たとえば、空白区切りの数値、または識別子を解釈するためのパーサは以下のように書ける。
parser = ((number | word) << whitespace.many_).many
parser.parse("123 abc 56.7") => ["123", "abc", "56.7"]
Parser#delimited を使って、もっと直感的に書くこともできる。
parser = (number | word).delimited(whitespaces)
parser.parse("123 abc 56.7") => ["123", "abc", "56.7"]