Ich bin neu in Parsec (und zu Parsern im Allgemeinen), und ich habe einige Probleme mit diesem Parser schrieb ich:Schwierigkeit immer ein Parsec Parser Leerzeichen überspringen richtig
list = char '(' *> many (spaces *> some letter) <* spaces <* char ')'
Die Idee ist, parsen Listen in diesem Format (ich arbeite an s-Ausdrücke oben):
(firstElement secondElement thirdElement and so on)
ich diesen Code schrieb, es zu testen:
import Control.Applicative
import Text.ParserCombinators.Parsec hiding (many)
list = char '(' *> many (spaces *> some letter) <* spaces <* char ')'
test s = do
putStrLn $ "Testing " ++ show s ++ ":"
parseTest list s
putStrLn ""
main = do
test "()"
test "(hello)"
test "(hello world)"
test "(hello world)"
test "(hello world)"
test "()"
T sein wird die Ausgabe erhalte ich:
Testing "()":
[]
Testing "(hello)":
["hello"]
Testing "(hello world)":
["hello","world"]
Testing "(hello world)":
["hello","world"]
Testing "(hello world)":
parse error at (line 1, column 14):
unexpected ")"
expecting space or letter
Testing "()":
parse error at (line 1, column 3):
unexpected ")"
expecting space or letter
Wie Sie sehen können, scheitert es, wenn es Leerraum zwischen dem letzten Element der Liste ist, und die Schließung )
. Ich verstehe nicht, warum der Leerraum nicht von der spaces
verbraucht wird, die ich gerade vor <* char ')'
eingegeben habe. Was für ein dummer Fehler habe ich gemacht?