Как получить значение из необязательного парсера в Parsec? - PullRequest
6 голосов
/ 13 октября 2010

Извините, если это вопрос новичка - я хочу разобрать что-то, определенное как

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) не сработают, так как опцияручная () не позволяет извлекать результат из его параметров, в данном случае parserOptionalPart0 / parserOptionalPart1.

Теперь, что было бы собственно способ сделать это?

Большое спасибо!

Билли Р

Ответы [ 2 ]

6 голосов
/ 13 октября 2010

Функция, которую вы ищете: optionMaybe.Он возвращает Nothing, если синтаксический анализатор не работает, и возвращает содержимое в Just, если он потребляет ввод.

5 голосов
/ 13 октября 2010

С документы :

option x p пытается применить парсер p. Если p завершается неудачно без использования ввода, возвращается значение 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, т.е. почти никогда не то, что вы хотите.

...