kosmikus / lhs2tex

Preprocessor for typesetting Haskell sources with LaTeX
Other
99 stars 28 forks source link

Loop on uppercase argument names #52

Open Blaisorblade opened 7 years ago

Blaisorblade commented 7 years ago

The following loops and leaks memory quickly. This got my lhs2TeX up to 23GB RAM usage—took me a while to kill it. Replacing Bar by bar fixes it—because Bar is not a valid variable name. I understand I made a mistake, but I imagine in principle this could be reported better than by looping.

% Emacs, this is -*- latex -*-!
%include polycode.fmt

%format baz Bar = "hi"
|baz a|

Parsing is done at https://github.com/kosmikus/lhs2tex/blob/master/src/Directives.lhs#L121-L122 and at https://github.com/kosmikus/lhs2tex/blob/master/src/Directives.lhs#L53-L64.

It seems my directive somehow passes the parser, because

%format ( baz Bar ) = "hi"

gives a syntax error.

*** Error in file ./pldi14/foo.lhs line 4:
syntax error in directive
 ( baz Bar ) = {-"hi"-}

The same happens with 1bar rather than Bar: %format baz 1bar = "hi" loops but %format (baz 1bar) = "hi" gives a syntax error.

It seems the equation is parsed successfully but it's not clear how and to what.

Blaisorblade commented 7 years ago

This fits the general theme of:

Actually, I just discovered that this is a general problem if you try to implicitly format anything that's not recognized properly. So even in Haskell mode, the definition and use of the following formatting directive causes a stack overflow:

https://github.com/kosmikus/lhs2tex/issues/33#issuecomment-29065363

I suspect having a configurable maximum expansion depth (defaulting, say, to 1000) would be the most robust fix for all the "infinite loop" issues (especially for actual infinite loops, which can't be fixed otherwise).