Scheme in Haskell, Parsec Example, how to add scheme comments

I am sure many of you have looked at the scheme in haskell example that is on the web by Jonathan Tang. If you are familiar with the code, I need a little help trying to add scheme style comments: "; This is my comment" I added this code here and I think it works (I replaced the name parseSpaces with his "spaces" function). But, if I start a line with a comment, it errors out with unbound variable. Anybody have any ideas? -- Added the ';' symbol :: Parser Char symbol = oneOf ";!$%&|*+-/:<=>?@^_~#\n" -- -- Handle whitespace and comments parseSpaces :: Parser () parseSpaces = (try oneLineComment) <|> whiteSpace <|> return () where whiteSpace = do skipMany1 space parseSpaces oneLineComment = do { try (string ";") ; skipMany (satisfy (/= '\n')) ; parseSpaces } http://halogen.note.amherst.edu/~jdtang/scheme_in_48/tutorial/overview.html

On Nov 18, 2007 7:32 PM, Berlin Brown
I am sure many of you have looked at the scheme in haskell example that is on the web by Jonathan Tang. If you are familiar with the code, I need a little help trying to add scheme style comments:
"; This is my comment"
I added this code here and I think it works (I replaced the name parseSpaces with his "spaces" function). But, if I start a line with a comment, it errors out with unbound variable. Anybody have any ideas?
-- Added the ';' symbol :: Parser Char symbol = oneOf ";!$%&|*+-/:<=>?@^_~#\n"
-- -- Handle whitespace and comments parseSpaces :: Parser () parseSpaces = (try oneLineComment) <|> whiteSpace <|> return () where whiteSpace = do skipMany1 space parseSpaces oneLineComment = do { try (string ";") ; skipMany (satisfy (/= '\n')) ; parseSpaces }
http://halogen.note.amherst.edu/~jdtang/scheme_in_48/tutorial/overview.html
Sorry, I am using the full scheme parser in this example: http://halogen.note.amherst.edu/~jdtang/scheme_in_48/scheme_in_48.zip -- Berlin Brown http://botspiritcompany.com/botlist/spring/help/about.html

On Sun, 2007-11-18 at 19:37 -0500, Berlin Brown wrote:
On Nov 18, 2007 7:32 PM, Berlin Brown
wrote: I am sure many of you have looked at the scheme in haskell example that is on the web by Jonathan Tang. If you are familiar with the code, I need a little help trying to add scheme style comments:
"; This is my comment"
The preferred way to do that is to use a token helper function: token :: P a -> P a token p = do r <- p whiteSpace return r -- or, if you add a Control.Applicative instance for your -- parser type, this is just: token p = p <* whiteSpace Then you handle comments as whitespace: whiteSpace :: P () whiteSpace = skipMany $ spaces <|> (char ';' >> skipMany (satisfy (/='\n'))) Then you just use that like this: symbol :: P String symbol = token $ many1 $ satisfy $ not . (`elem` "()[]; ") See also Parsec's TokenParser.

On Nov 18, 2007 8:01 PM, Thomas Schilling
On Sun, 2007-11-18 at 19:37 -0500, Berlin Brown wrote:
On Nov 18, 2007 7:32 PM, Berlin Brown
wrote: I am sure many of you have looked at the scheme in haskell example that is on the web by Jonathan Tang. If you are familiar with the code, I need a little help trying to add scheme style comments:
"; This is my comment"
The preferred way to do that is to use a token helper function:
token :: P a -> P a token p = do r <- p whiteSpace return r
-- or, if you add a Control.Applicative instance for your -- parser type, this is just: token p = p <* whiteSpace
Then you handle comments as whitespace:
whiteSpace :: P () whiteSpace = skipMany $ spaces <|> (char ';' >> skipMany (satisfy (/='\n')))
Then you just use that like this:
symbol :: P String symbol = token $ many1 $ satisfy $ not . (`elem` "()[]; ")
See also Parsec's TokenParser.
token :: Parser -> Parser String token p = do r <- p whiteSpace return $ String r I know I am being lazy, but what am I missing in your pseudo code: I tried playing with your example but kept getting these errors: Parsec3.hs:23:13: The last statement in a 'do' construct must be an expression at the token line. -- Berlin Brown http://botspiritcompany.com/botlist/spring/help/about.html

On Nov 22, 2007, at 0:50 , Berlin Brown wrote:
token :: Parser -> Parser String token p = do r <- p whiteSpace return $ String r
You have an indentation problem: whiteSpace and return should be at the level of "r", not "p". -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH
participants (3)
-
Berlin Brown
-
Brandon S. Allbery KF8NH
-
Thomas Schilling