2014-07-24 2 views
0

J'ai une situation idiote dans mes analyseurs parsec sur laquelle j'aimerais recevoir votre aide.Analyser un seul caractère qoute dans une chaîne entre guillemets

J'ai besoin d'analyser une séquence de forts/caractères séparés par | personnages. Ainsi, nous pourrions avoir un | b | 'c' | 'abcd'

qui devrait être transformé en

[a,b,c,abcd] 

espace n'est pas autorisé, à moins que l'intérieur d'une chaîne ''. Maintenant, dans ma tentative naïve, j'ai maintenant la situation où je peux analyser des chaînes comme a'a | 'bb' à [a'a, bb] mais pas aa | 'b'b' à [aa, b'b] .

singleQuotedChar :: Parser Char 
singleQuotedChar = noneOf "'" <|> try (string "''" >> return '\'') 

simpleLabel = do 
    whiteSpace haskelldef 
    lab <- many1 (noneOf "|") 
    return $ lab 

quotedLabel = do 
    whiteSpace haskelldef 
    char '\'' 
    lab <- many singleQuotedChar 
    char '\'' 
    return $ lab 

Maintenant, comment puis-je dire à l'analyseur de considérer 'un arrêt' si cela est suivi par un | ou un espace blanc? (Ou, obtenez un peu de caractère compte dans cela). L'entrée est générée par l'utilisateur, donc je ne peux pas compter sur les caractères.

+2

Vous essayez d'analyser '' b'b'', mais dans 'singleQuotedChar' vous avez besoin que les guillemets simples n'apparaissent que par paires. Vouliez-vous essayer d'analyser '' b''b'' comme 'b'b'? Si vous voulez que '' b'b '' soit analysable, vous devez changer la définition de singleQuotedChar. – rampion

+0

Comment l'analyseur est-il supposé savoir qu'il devrait garder le milieu 'aa''b'b'? J'ai du mal à comprendre ce que tu veux faire. Est-ce comme un tableau de parenthèse, mais n'est valide qu'en tant que tel à côté d'un |? Pourquoi l'avoir du tout si c'est le cas? (Réponse possible: cela fait partie d'une entrée plus grande où les espaces signifient autre chose.) – AndrewC

+0

Voici ce que je pense que vous voulez dire: Une chaîne est une séquence de lettres (ou de nombres?), D'apostrophes et d'espaces entre apostrophes ou une séquence de lettres (nombres) et apostrophes non encadrées par des apostrophes. Les chaînes sont interpolées avec des barres verticales. – AndrewC

Répondre

1

Notez que permettre une citation au milieu d'une chaîne délimitée par des guillemets est très déroutant à lire, mais je crois que cela devrait vous permettre de l'analyser.

quotedLabel = do -- reads the first quote. 
    whiteSpace 
    char '\'' 
    quotedLabel2 

quotedLabel2 = do -- reads the string and the finishing quote. 
    lab <- many singleQuotedChar 
    try (do more <- quotedLabel3 
      return $ lttrace "quotedLabel2" (lab ++ more)) 
    <|> (do char '\'' 
      return $ lttrace "quotedLabel2" lab) 


quotedLabel3 = do -- handle middle quotes 
    char '\'' 
    lookAhead $ noneOf ['|'] 
    ret <- quotedLabel2 
    return $ lttrace "quotedLabel3" $ "'" ++ ret 
+0

Bonjour. Peut-être que je suis stupide, mais je reçois une erreur en compilant le code ci-dessus car 'lttrace' n'est pas défini. Où est-ce que je l'obtiens? –

+0

Oups, il suffit de remplacer chaque 'lttrace x y' par y – tohava

Questions connexes