BNFC / bnfc

BNF Converter
http://bnfc.digitalgrammars.com/
586 stars 165 forks source link

Haskell: local variables in Printer may clash with printing functions #337

Closed andreasabel closed 3 years ago

andreasabel commented 3 years ago
M. Main ::= Prt;
P. Prt  ::= Integer;

The generated printer does not compile:

[4 of 6] Compiling PrintTest        ( PrintTest.hs, PrintTest.o )

PrintTest.hs:110:43: error:
    • Couldn't match expected type ‘t0 -> AbsTest.Prt -> Doc’
                  with actual type ‘AbsTest.Prt’
    • The function ‘prt’ is applied to two arguments,
      but its type ‘AbsTest.Prt’ has none
      In the expression: prt 0 prt
      In the first argument of ‘concatD’, namely ‘[prt 0 prt]’
    |
110 |     AbsTest.M prt -> prPrec i 0 (concatD [prt 0 prt])
    |                                           ^^^^^^^^^

The problem is that the constructor arguments are lowercase versions of the argument types, e.g. Prt gives prt, which is the name of the printing function.

A solution is to prefix the local variables with an underscore.

andreasabel commented 3 years ago

A solution is to prefix the local variables with an underscore.

There was also a list of names to avoid, I added prt and doc.