
On Wed, Dec 06, 2006 at 05:37:01PM -0800, Carl Witty wrote:
On Wed, 2006-12-06 at 16:56 -0800, John Meacham wrote:
Having played with haskell parsers for various reasons, the layout rule is quite tricky due to the rules involving 'parse-error'. if we could come up with a formulation that didn't have those. it would make things a whole lot nicer. something like an unexpected 'in', 'of', ')' '}' ']' might do it. the lexer would have to keep track of matching brackets.. hmmm..
Yes, not having the parser->lexer feedback would be great! And this proposal seems like it should work quite well. Somebody with a lot more spare time than me should code it up and see how much real code it breaks.
there is the helium layout rule: http://www.cs.uu.nl/helium/docs/LayoutRule.html which is similar to what I am thinking of but only has a special case for 'in'. my general thought is to take the layout rule algorithm from the haskell report, and add some more possibiliies to the 'layout stack'. so, right now it is layout :: [Token] -> [Int] -> [Token] where the first argument is the token stream, the next argument is a stack of layout contexts, and the result is the new token stream. now we change it to something like (in semi-psuedo haskell) data LContext = LExpects Token | LLevel Int expectableTokens = ['of','in',')','}',']'] and change the signature to layout :: [Token] -> [LContext] -> [Token] layout = ... now, LLevel nodes will be pushed just like the old algorihm, but whenever a 'case' for instance is encountered, a "LExpects 'of'" node will be pushed. now, whenever we get something in expectableTokens, an 'of' say, either the top of the stack is a LExpects 'of', in which case we pop it add the 'of' to the output stream and continue, or it is a 'LLevel' in which case we insert a '}' then pop the LLevel and continue (with the 'of' still in the input stream) I think something like this could work. the only odd bits I can think of are handling 'let's without 'in's as occur in 'do' blocks, and the comma, but I think we can integrate them too. does something like this seem like it will work? John -- John Meacham - ⑆repetae.net⑆john⑈