Как мне справиться с проблемой разбора строки в haskell - PullRequest
1 голос
/ 28 января 2020

Я новичок в Haskell, и я пытаюсь создать парсер с другими условиями для понимания языка.

Здесь мой парсер для типа String:

parseString :: Parser Haskell
parseString = do
    char '"'
    x <- many $ satisfy (\c -> isAscii c && not (c == '\"'))
    char '"' 
    return $ String x

И мой модульный тест

it "return substring" $ do
            parse parseLiteral "\"\"\"Hello" `shouldBe` [(String "\"", "Hello")]`

У меня есть проблема с разбором:

ожидается: [("\" "," Hello ")]

но получил: [("", "\" Hello ")]

Я не знаю, где моя ошибка. У тебя есть идея?

1 Ответ

2 голосов
/ 28 января 2020

Ваш парсер работает точно так же, как и кодированный:

  1. Сначала char '"' потребляет первую цитату
  2. Затем many $ satisfy ... ничего не потребляет, потому что следующая символ - это кавычка, которая не удовлетворяет предикату
  3. Наконец, char '"' потребляет вторую кавычку, в результате получается пустая строка и остается неиспользованный хвост "Hello"

Если вы хотите, чтобы ваш синтаксический анализатор рассматривал начальные три кавычки как кавычки, вы должны определить некоторые строгие правила, как это будет работать.

Например, если четыре кавычки в строке анализировать как две кавычки, которые указаны с обеих сторон, или это должна быть одна кавычка с неиспользованным хвостом, состоящим из одной кавычки?

А как насчет других символов? Должен ли "foo"bar" быть проанализирован как "foo\"bar" или как "foo" с неиспользованным хвостом bar"?

Короче говоря, есть веская причина, почему существуют escape-последовательности: -)

...