Commit Graph

420 Commits

Author SHA1 Message Date
Neil Brown
ccb6c7aa1d Fixed the types in various test modules to work with Polyplate 2008-12-14 19:18:00 +00:00
Neil Brown
2349474ba6 Fixed the occam modules to work with the new Polyplate type-classes 2008-12-14 18:52:52 +00:00
Neil Brown
1141ecb472 Fixed the Rain modules to use the new Pass system/types 2008-12-14 18:35:39 +00:00
Neil Brown
aa10b0113d Allowed direction specifiers to be added to variables that are channel bundles when they are passed as arguments 2009-04-12 13:51:48 +00:00
Neil Brown
da43dcb3f5 Allowed multiple empty dimensions in mobile types, not just one 2009-04-12 13:51:32 +00:00
Neil Brown
5534d1c3d6 Fixed some problems with DATA TYPEs that were actually MOBILE stuff not being resolved at the right points 2009-04-12 13:50:59 +00:00
Neil Brown
ddbec737f2 Got all the tests compiling again after recent changes
For some reason, the usage check tests are now very slow to run (perhaps because of all the operator definitions added to each one?), which needs further investigation.
2009-04-10 19:29:40 +00:00
Neil Brown
e462da4a76 Added a system for specifying implicitly-used modules on the command-line
An implicitly used module is equivalent to a #USE directive before the first line of the main file.  This, combined with changes in occbuild, are my current way of implementing the automatic use of the forall module in occam.
2009-04-10 19:26:22 +00:00
Neil Brown
09ea5fd610 Fixed operators not being written correctly to include files 2009-04-10 18:26:39 +00:00
Neil Brown
ce0214cbf4 Fixed operators defined inside functions not being recorded in csOperators 2009-04-10 16:07:18 +00:00
Neil Brown
e53da5822f Fixed a problem where operators with % in the name were screwing up an error message 2009-04-10 16:06:49 +00:00
Neil Brown
92c92a3f65 Fixed various small mobile typing issues 2009-04-09 17:05:16 +00:00
Neil Brown
229f2197af Turned findMeta into a member of a FindMeta type-class 2009-04-09 11:13:37 +00:00
Neil Brown
998cf1c005 Fixed various bits of type-inference in OccamTypes 2009-04-09 10:00:03 +00:00
Neil Brown
de097bb138 Fixed type-checking on ambigious record fields, so that now the cgtests are happy again 2009-04-08 19:11:33 +00:00
Neil Brown
6814ac2679 Added a joinWith helper (short for concat . intersperse) and changed most of the uses in the code to use the helper function 2009-04-08 16:28:23 +00:00
Neil Brown
397d8b7936 Resolved the types of the operators before searching through them for matches 2009-04-08 12:30:48 +00:00
Neil Brown
dc4cfe331b Made the operator search ignore the values of array dimensions, as it should do 2009-04-08 12:23:45 +00:00
Neil Brown
1ea35c6715 Fixed the name munging for declared user-defined operators 2009-04-08 12:14:05 +00:00
Neil Brown
d782c91ed0 Added some missing occam operators to the various lists 2009-04-08 12:03:48 +00:00
Neil Brown
26be673ce1 Made sure that user-defined types are resolved before looking for matching operator definitions 2009-04-08 10:18:14 +00:00
Neil Brown
49d6e2aaaf Reworked how the stack sizes are recorded and merged together
The previous method, using the C preprocessor was both nasty, and crazily resource-intensive.  The new method stores stack size information in files that are read in and processed by the compiler when it comes time to link.
2009-04-07 16:03:52 +00:00
Neil Brown
a8c9802f5d Changed the occam type checker to handle checking user defined operators better
They are now recursed into with no type context, then afterwards the type is deduced.  This seems to be how they were meant to work, and is also much faster than what I was doing.
2009-04-07 15:52:06 +00:00
Neil Brown
7031ab7fb8 Changed the lexer to make it lex the new (user-defineable) operators 2009-04-07 15:51:34 +00:00
Neil Brown
e648a87fd1 Turned REM into \ in the parser, as that was the easiest place to do it 2009-04-07 15:43:56 +00:00
Neil Brown
095e3e1680 Fixed the parsing of associative operators 2009-04-07 15:43:41 +00:00
Neil Brown
9260048da2 Quickly fixed the Rain frontend to compile with the operator changes 2009-04-05 23:08:12 +00:00
Neil Brown
e1c18cc082 Changed inferTypes to resolve operators to the right definition
This patch follows on from the previous change to the parser.  When it spots a function-call, it looks for operators and treats them differently.

It keeps a stack of operators in scope (csOperators in CompState), and when an operator is used, it searches the stack (with all old definitions masked out) for operator definitions to resolve to.

The way it chooses which operator to use in the presence of overloadings (e.g. + on INT vs + on INT32) is simply to try them all.  If one matches, it uses that.  If none, or more than one match, it gives an error.  This makes the code simple and seems logical, but I'm not totally confident if this is the required behaviour for resolving overloaded operators.
2009-04-05 23:01:26 +00:00
Neil Brown
f7e114f2fd Overhauled the Types module and ParseOccam to support the new system of operators-as-functions
The idea behind this is to parse unary/binary operators into function calls with 1/2 operands.  So the AST actually has a FunctionCall with the name "+".  Function names may now be quoted operators, and thus you can also have function declarations with names such as "+".  Resolving is *not* done in the parser for these function names, but rather every "+" is left as "+" (no matter what types it operates on, or what is in scope) by the parser (see later patches to InferTypes instead).

When parsing an occam source file, we automatically insert a bunch of PRAGMA TOCKEXTERNAL that define the default occam operators (e.g. + on INT) as external C functions (which they are!).  The naming scheme for these C functions is standardised, and must be used by functions such as mulExprs (which bases the function on the type of its operands) and the new versions mulExprsInt (which are pegged to INT).

The Types module also has some new functions for dealing with operator-functions.
2009-04-05 22:54:05 +00:00
Neil Brown
364bc6f31e Made double-star be resolved into a single star when parsing a string literal
I should probably do all the other escapes too, but for now I haven't.
2009-04-05 22:29:32 +00:00
Neil Brown
8400de520b Fixed the regular expression on #INCLUDE and #USE to allow any white-space at the end 2009-04-04 15:34:43 +00:00
Neil Brown
c2174743e7 Made the unknown preprocessor directive warning show what the unknown directive was 2009-04-04 15:34:17 +00:00
Neil Brown
e457d82f0c Changed FUNCTIONs and PROCs to have optional bodies, and put all the externals into the AST (without bodies)
This may seem like an odd change, but it simplifies the logic a lot.  I kept having problems with passes not operating on externals (e.g. functions-to-procs, adding array sizes, constant folding in array dimensions) and adding a special case every time to also process the externals was getting silly.

Putting the externals in the AST therefore made sense, but I didn't want to just add dummy bodies as this would cause them to throw up errors (e.g. in the type-checking for functions).  So I turned the bodies into a Maybe type, and that has worked out well.

I also stopped storing the formals in csExternals (since they are now in csNames, and the tree), which streamlined that nicely, and stopped me having to keep them up to date.
2009-04-04 14:56:35 +00:00
Neil Brown
2a321d7910 Added a NameExternal item to NameSource, to stop using NamePredefined for externals 2009-04-04 14:56:00 +00:00
Neil Brown
c361a36e41 Added a message so that when we fail to find a file, we say exactly where we looked 2009-04-04 12:31:06 +00:00
Neil Brown
f755458545 Turned *EXTERNAL pragmas into specifications in the occam parser
There was a bug where things scoped in via pragmas were never scoped out again, which was screwing up the local names stack.  I then realised/decided that pragmas were really specifications, and decided to put them there in the parser.

The rest of this patch is just some rewiring to allow the special name munging involved in pragmas (they have already got a munged version of their name) and to stop the scoped in pragmas appearing in the AST.
2009-04-03 21:06:24 +00:00
Neil Brown
4a36d578c0 Added a check that the names being scoped out match the names that were scoped in, which helps find bugs in the parser 2009-04-03 21:03:19 +00:00
Neil Brown
8170d9569d Added some code to Tock to be able to handle unlexable ASM blocks in source files 2009-04-03 17:54:13 +00:00
Neil Brown
081e4f79d4 Added more recognised suffixes to knock off in #USE directives 2009-04-03 16:52:00 +00:00
Neil Brown
427938039c Implemented a search path for Tock (for #INCLUDE and #USE directives) 2009-04-03 16:51:00 +00:00
Neil Brown
8220630426 Attempted to fix a problem with parsing pragmas, but I suspect it's still a bit haphazard 2009-04-03 16:50:41 +00:00
Neil Brown
0d63eeb400 Fixed a small parser bug involving variant 2009-04-03 15:34:33 +00:00
Neil Brown
471c3a1ef5 Allowed #INCLUDE and #USE directives to have comments after the quoted part
I couldn't decide whether to fix this in the parser or the preprocessing code.  I went for the latter, as it was the simplest option.
2009-04-03 14:37:10 +00:00
Neil Brown
9bf32e339d Made sure that the names printed in TOCKEXTERNAL pragmas are fully munged (and thus equivalent to the exact C function name) 2009-04-03 12:22:19 +00:00
Neil Brown
d6ad0ba202 Made the name of record-copying PROCs different for each file that generates them, to avoid clashes at link time 2009-04-03 10:25:55 +00:00
Neil Brown
dbc1b461a4 Made makeNonce use the munged meta-tag, to stop wrapper PROCs from different files having name clashes at link-time 2009-04-02 20:02:11 +00:00
Neil Brown
70789661f1 Got pragma-declared FUNCTIONS to be turned into PROCs and handled properly 2009-04-02 18:13:51 +00:00
Neil Brown
460c3e287f Changed names to be uniquified based on their source position, and fixed the source position for things in pragmas
The second part of the patch is essential, given the first.  Otherwise names in different pragmas in the same file can overlap -- this already happened in oak!
2009-04-02 17:45:31 +00:00
Neil Brown
a843d07463 Changed the pragmas to support FUNCTIONs, and to order the names the other way (as Adam wanted) 2009-04-02 16:57:11 +00:00
Neil Brown
dbd315abd6 Allowed underscores in occam identifiers
I must admit, this was mainly done to allow munged names back in again as valid identifiers.

OEP 144 suggests replacing dot with underscore; this change just allows underscore alongside dot.  It won't break any existing code, and seems like something we want anyway, so I think it's a valid thing to do.
2009-04-02 15:42:26 +00:00