14:14:26, Saturday, 28 Mar 98 On lexing: the lexer is linked to the parser in an unconventional way. The lexing function must pass back a symbol, which contains a token id, and the lexical Object. I chose to pass back the token id, and the YYtoken itself, which contains the lexical object. It may be best to change this, to allow type-checking to be enforced by the parser. The way it stands, each tterminal symbol in the parser has an associated type of `Yytoken'. These should really be String, Double etc. 20:13:35, Saturday, 28 Mar 98 BUG in java_cup - you need to declare "start with" else it doesn't return a value from the final production. How bugging. 22:24:32, Saturday, 28 Mar 98 BUG??!?!? I couldn't use NUM as a PepaToken name - when I changed all occurences of NUM to NUMB, the Parser suddenly started working. Weird. 18:45:45, Sunday, 29 Mar 98 I may be speaking too soon, but... First, we know there's a restriction with pizza types, related to coercion. This is not possible Set l = (Set)m; You can't have parameterised info in the coercion. The web page claims something like (Set)m is possible, but when could that be used? If I try to use a construct like that, I get an error that Set is not a subtype of Set This seems like a bug to me. A fix is to declare a dummy class that trivially extends an instantiation of Set e.g. public class ActionSet extends Set { } then freely coerce to ActionSet, knowing that everything that works there will work on the supertype objects. 22:33:30, Monday, 30 Mar 98 I want something like a sum class: public class Either { case Inl(A elem); case Inr(B elem); } But when I write a function that expects one of these as an argument, it goes something like public boolean wahey(Either e) {} but an argument must be like Inl(1.0) or Inr(4). However pizza can't reconcile Inl(1.0) : Either with the arg the function expects! Stop Press: maybe not, I was using double! Not Double! Test later... 22:38:42, Monday, 30 Mar 98 Why can't cases be expressions? This causes problems when you must call this() as the first thing in a constructor... 22:47:48, Monday, 30 Mar 98 Annoying - pizza can't distinguish function arg types if they're, say, A and A - no homogeneous translation... 01:28:56, Friday, 03 Apr 98 Why again do I use Double instead of double in all my classes? 17:10:39, Monday, 20 Apr 98 // This is crap. I have to use Action here, instead of Activity, // because of this (also Process instead of PepaProcess) // Process.pizza:777: type parameter pepa.process.Activity is not // within bound pepa.process.EqType // (pepa.process.Activity is not a subtype of // pepa.process.EqType) // public Graph> This implies my graphs are crafted from processes and actions, to which the interfaces apply, not pepaprocesses and activities, to which they don't seem to apply. I don't understand this properly. I have that Action matches the interface EqType. Activity inherits from Action. Does not Activity then match the interface EqType? Why not? Is it unsafe to allow this? 18:48:25, Monday, 20 Apr 98 Are hashtables usually lossy? Dowh! 22:45:48, Tuesday, 10 Nov 98 Crap things - if I call clone(), from some object that is parameterised e.g. Set, then the return type of the thing is Object - and I can't cast it up to Set!! The only cast I can apply is (Set)s.clone(); and then it complains that Set is not a subtype of Set! How to get around this? 10:43:57, Sunday, 15 Nov 98 PepaProcess extends Process. Process implements ProcessInt which in turn maps down to EqAndHash I add a hashCode() function to Process, and this enables me to have a CSet - since Process satisfies EqAndHash. However, even adding a hashCode to PepaProcess won't give me a CSet of PepaProcesses - it seems one of the subtyping/interface subtyping relationships means PepaProcess still doesn't satisfy EqAndHash type. Crap, why not? 10:44:58, Friday, 29 Jan 99 Something to note. A process looking like (a,2) ( (a,T) + (a,3) ) is supposed to be illegitimate in PEPA. In working out rates, you get an expression over (T + 3) which is impossible to make sense of. Peparoni will do a check on the fly to make sure this never happens. Surely we could preprocess to check for this kind of thing?