Comment puis-je gérer mon problème d'analyse de chaîne dans haskell


drx_2341

Je suis nouveau dans Haskell et j'essaye de créer un analyseur avec différentes conditions pour comprendre le langage.

Voici mon analyseur pour un type String:

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

Et mon test unitaire

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

J'ai ce problème d'analyse:

attendu: [("\" "," Hello ")]

mais obtenu: [("", "\" Hello ")]

Je ne sais pas où est mon erreur. Avez-vous une idée?

Fyodor Soikin

Votre analyseur semble fonctionner exactement comme codé:

  1. Tout d'abord, char '"'consomme le premier devis
  2. Ensuite, many $ satisfy ...ne consomme rien, car le caractère suivant est une citation, ce qui ne satisfait pas le prédicat
  3. Enfin, char '"'consomme la deuxième citation, ce qui donne une chaîne vide et laisse une queue non consommée de"Hello"

Si vous souhaitez que votre analyseur traite les trois guillemets initiaux comme des guillemets, vous devez définir des règles strictes sur la façon dont cela fonctionnerait.

Par exemple, quatre guillemets d'affilée devraient-ils être analysés comme deux guillemets qui sont cités des deux côtés, ou devrait-il s'agir d'un guillemet avec une queue non utilisée composée d'un guillemet?

Et s'il y a d'autres personnages? Doit "foo"bar"être analysé comme "foo\"bar"ou comme "foo"avec une queue non consommée de bar"?

En bref, il y a une bonne raison pour laquelle des séquences d'échappement existent :-)

Articles connexes