Как получить значение из необязательного парсера в Parsec?

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

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

Как это сделать правильно?

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

Билли Р.


person Bill Rong    schedule 13.10.2010    source источник


Ответы (2)


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

person Paul    schedule 13.10.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, т.е. почти никогда не то, что вы хотите.

person keegan    schedule 13.10.2010
comment
Киган, спасибо за ответ и исправление моего кода. Это сработало в основном так, как я хотел - есть некоторые проблемы с случаями, не описанными в исходном посте. Я новичок в Haskell и Parsec, я просто буду читать и пробовать больше. Спасибо. - person Bill Rong; 14.10.2010