[self-interest] oldParser. using ?

Jecel Assumpcao Jr jecel at merlintec.com
Mon Oct 22 23:26:22 UTC 2001

Sorry about the long delay. The local "high tech fair" I was busy with 
(see http://www.merlintec.com) ended just yesterday.

On Monday 15 October 2001 09:11, Marko Mikulicic wrote:
> I made some hacks to implement resend but I have added categorization
> so now the code is more readable. The parser is surprisingly elegant
> and simple and it
> would be a good example of the power of self

That is something that was specifically disclaimed for the previous 
parser :-)

> (although it doesn't use
> many self-related features; it could
> in fact been rewritten in smalltalk without too many problems, but in
> self looks more elegant).

That is usually the case. I like to point out to people (I did so a lot 
in the last few days...) that the end result is not very different for 
Self and Smalltalk, but the process of getting there is. If that isn't 
important for them (people who only study programs instead of actually 
writing them) then they don't see what is the big deal.

>  The parser builds only the parse tree. A bytecode generator would

Were you going to write "easy to write"? I would agree with that.

> They use strings, but they separate object annotations from slot
> annotations.
> If I understood well the annotation mechanism, the parser takes the
> nested annotations and flattens
> it in a string which is stored in the object's map. I want to know
> how it stores the relationship
> between the slot annotation part and the collection of slot names it
> references.

My understanding is that there is one annotation for the object and 
separate annotations for each of the slots. See this code fragment from 
the VM:

  struct slotDesc {
          stringOop name; // the slot's name
          slotType type;  // type and properties (slotType.h)
          oop data;
          oop annotation; // the VM does not care what is here; just 
for the Self world 

When an annotation is associated with a bunch of slots, I think each 
slot has its own pointer to it.

> For example:
> (| {} = 'Comment: cmt' slot1 . {'Comment: slot comment' slot2. slot3}
> . slot4|)
> this object will have an object comment, and the slots slot2 and
> slot3 will have the same comment ('slot comment').
> When i send asMirror annotation to this object I get only 'Comment:
> cmt'. Where are the other comments stored ?

Try asking for one of the slots and see if you can't get its annotation.

> I know that I can access the slot annotations trough slot reflection,
> but I want to know how this is stored in the object annotation (I
> only readed that objects have annotation. slots doesn't seem to
> directly have annotations).

I am not sure about this, but I think they do. Which makes maps even 
larger than they were before :-(

> Wich separator
> is used ? if you use 16r7f then how the can the framework-level
> annotation groups (ModuleInfo;, Comment: ...) been distinguished from
> the flattening of nested annotations ?
>  At least I want to know if the annotations are really strings and if
> they are really stored in the object, and not in a per slot fashon.

It seems that they are stored in a per slot fashion.

> Yes I know about Mango and but I heard that the Self syntax is not
> well suited for parser generators (not LAR or whatever is called).

Not really.

> I remember you have said that you started but I also remember you
> said that you don't remember why you didn't finish it, probably
> because the grammar was ambiguos
> (I think expecially the keyworded send and the resend with the obuse
> of dot notation. perhaps annotations
> also bring some problem; the progref says the grammar of annotations
> is ambiguos).

I didn't have any problems with annotations. And I think I did ok with 
the resends and stuff, but I never actually ran it through Mango and 
there might be lots of bugs. The real problem was dealing with the 
lexical level since "." is hard to parse. But it is mainly things like 
numbers and strings which are missing and they shouldn't be hard to add.

> Also I don't know how big the resulting parser will be and witch
> parts of the framework it will use.

It wouldn't be too bad, but certainly larger than a handcrafted one. 
Note that you can add special filters in Mango (as the typedef one in 
the C example) to handle special cases where otherwise the parser would 
become too large or even impossible to build.

> For a bootstrapping a handcrafted parser is better suited, I think.
>  Also, I don't know how better is Mango than bison but maybe there is
> a reasion why the parser in the VM was handcrafted and not generated.

Mango is much nicer and uses a "structured BNF" which is simpler to 

> If I finish that parser it would be nice to try to make the VM switch
> to it for evaluating code from its primitives.
> The hardcoded parser will be certainly better in error handling for
> now but I think it would be great if more  code migrates to Self from
> the VM. I don't want to Squeakize Self but at least the parser....

I am trying to have 100% of the VM in Self (the compilers, parser and 
so on) so you have my complete support. I don't think Squeak goes far 
enough (it is written in Slang, a subset of Squeak, and not in the full 
language) and that they are paying a very heavy price for this.

-- Jecel

More information about the Self-interest mailing list