Fetching contributors…
Cannot retrieve contributors at this time
82 lines (61 sloc) 3.47 KB
Compiler Base TODO
Short Term:
* See general/UNames.hs for nhc98 induced ugliness; change when nhc98 is fixed
* Lexers: For unicode `Char', we need to explicit support for positive and
negated ranges such as ['\0'..'\255'] and ['\0'..'\255'] \\ ['a'..'c'],
where the latter is usually written [^abc] (see the haskell-cafe
* Roman introduced the class `Printable'. A general class based pretty-print
system would be nice.
* Parsers: Roman had the idea of allowing boolean functions to disambiguate
the parse table where two rules cannot be distinguished by the usual LL
mechanism alone (see emails).
* Identifiers in any of the intermediate languages that have the same lexeme as
a keyword or a predefined identifier should always been pretty-printed in
their quoted form.
Difficult to know for each IL which identifiers have to be treated specially.
We need a kind of IL-dependent exception list.
Middle Term:
* Use a different attribute mechanism. The stuff started for the flatten
prototype looks quite promising. Observations:
- Current hipar system with a unique in every node => makes it complicated
to construct/transform trees, as we always have to clone subtress in a
- GHC's system => when attributes of an identifier are updated, the
"new" identifiers have to substituted into all expression that contain
usage occurences.
* Graph processing support: Does it need to be a new mechanism or can we
realise it via Attrs (what kind of generic functions could we provide). One
possibility is the use of an `Bool' attribute used to implement fast sets
(eg, marking). (If there is a lot of marking, we might want to realise
indexing with attributes via hashing to be able to work with sparse keys and
to already have O(1) during attribute table construction.)
* `FiniteMap' should be an instance of `Functior' with `fmap = mapFM'
* configuration shouldn't be in
* FNameOps, FileOps: Introduce an autoconf set variable that determines
whether "/" or "\" is used as a delimiter in paths
* Lexers: * After a certain number of errors (say 50); abort lexing.
* Parsers (maybe similar problem with Lexers): If the grammar is not LL(1), we
just get an `ambiguous grammar' error message at runtime without any hint,
which part of the grammer might be ambiguous. This is too hard to debug!
* In the language-specific `XXXAttrs.hs' modules, the routines for handling
the different on the attribute tables have always the same structure; Only
the access to the `AttrXXX' datatype is different. It should be possible to
generalize them.
Moreover, the `referring identifier information' is always needed and might
be generalized.
* The handling of state could be improved by revising the state modules and
using constructor classes and monad transformers.
Currently, we only define the state type abstractly when generating a new
instance of `CST'. This is in order to be able to use the generic
operations, such as I/O, also in the monad instance. But this comprises the
security of the monad encapsulation as also the generic functions that allow
to extract and copy the state can be used. Ideally, we want to lift generic
operations like I/O automagically into the new monad and to protect it from
access to its state. Furthermore, some support for stripping and attaching
of the type-tag (intro with `newtype') would be nice.