Как приспособить многих к возвращению в левый атопарсек на Хаскеле - PullRequest
0 голосов
/ 02 июля 2018

Например

parseTest :: Parser Int
parseTest = char '(' *> return 1 <* char ')'

parseTests :: Parser [Int]
parseTests = many' $ char '(' *> return 1 <* char ')'

parseOnly ParseIni.parseTest "(" -- returns Left with error
parseOnly ParseIni.parseTests "(" -- returns Right with []

Как я могу заставить второй вернуть Left с потерянным ), и я также хочу проанализировать случай с пустой строкой с ответом Right []

1 Ответ

0 голосов
/ 02 июля 2018

Из документа parseOnly

Чтобы заставить анализатор использовать все свои входные данные, используйте что-то вроде этого:

parseOnly (myParser <* endOfInput)

ParseIni.parseTests применяет синтаксический анализатор char '(' *> return 1 <* char ')' ноль или более раз. Это всегда успешно, так как он может, по крайней мере, применить его ноль раз. Таким образом, вы должны убедиться, что он потребляет все, составляя его с endOfInput.

parseOnly (ParseIni.parseTests <* endOfInput) "("
...