6

初心者の質問で申し訳ありません-定義されたものを解析したい

Exp ::= Mandatory_Part Optional_Part0 Optional_Part1

私はこれができると思った:

proc::Parser String

proc = do {

    ;str<-parserMandatoryPart

    ;str0<-optional(parserOptionalPart0)  --(1)

    ;str1<-optional(parserOptionalPart1)  --(2)

    ;return str++str0++str1

}

オプションの部分が存在する場合は str0/str1 を取得したいです。そうでない場合、str0/str1 は "" になります。ただし、(1) と (2) は機能しません。optional() では、そのパラメーター (この場合は parserOptionalPart0/parserOptionalPart1) から結果を抽出できないためです。

今それを行う適切な方法は何ですか?

どうもありがとう!

ビリー・R

4

2 に答える 2

6

お探しの機能はoptionMaybe. Nothingパーサーが失敗した場合は戻り、入力を消費した場合はコンテンツを返しますJust

于 2010-10-13T07:31:45.317 に答える
5

ドキュメントから:

option x pパーサーを適用しようとしますpp入力を消費せずに失敗した場合は value を返し、xそれ以外の場合は によって返された値を返しますp

したがって、次のことができます。

proc :: Parser String
proc = do
  str  <- parserMandatoryPart
  str0 <- option "" parserOptionalPart0
  str1 <- option "" parserOptionalPart1
  return (str++str0++str1)

「入力を消費しない」部分に注意してください。オプションのパーサーのいずれかまたは両方を でラップする必要がある場合がありますtry

また、コード スタイルをより標準的なものに調整し、最後の行のエラーを修正しました。 returnキーワードではありません。普通の機能です。そうreturn a ++ bです(return a) ++ b、つまり、あなたが望むものはほとんどありません。

于 2010-10-13T07:33:52.587 に答える