[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: "alternative1 | alternative2" to " alternative1* alternative2*" ast transformation



Hi Søren, all,

You're still getting some erros because you didn't add a question mark operator "?" to the "slot" production transformation elements whereas you specify a match with "Null" in the associated alternative transformation.
If you want a "Null" simple term to match some previous declared transformation element, this element should have a "?" operator.
This is due to strict type checking constraints in SableCC3.x.beta


Try this :

-------------------------------- Begin  -----------------------------------------
Tokens

parent = 'parent';

import = 'import';

promote = 'promote';

container = 'container';

variable = 'variable';

public = 'public';

private = 'private';

Productions

object {-> slots} = slot*

{-> New slots([slot.parent_slot], [slot.promote_slot],

[slot.container_slot], [slot.import_slot], [slot.variable_slot],

[slot.public_slot], [slot.private_slot])};

	slot {-> parent_slot*?* promote_slot*?* container_slot*?* import_slot*?* variable_slot?
		 public_slot*?* private_slot*?*} =

{parent_slot} parent_slot {-> parent_slot Null Null Null Null Null Null} |

{promote_slot} promote_slot {-> Null promote_slot Null Null Null Null Null} |

{container_slot} container_slot {-> Null Null container_slot Null Null Null Null} |

{import_slot} import_slot {-> Null Null Null import_slot Null Null Null} |

{variable_slot} variable_slot {-> Null Null Null Null variable_slot Null Null} |

{public_slot} public_slot {-> Null Null Null Null Null public_slot Null} |

{private_slot} private_slot {-> Null Null Null Null Null Null private_slot} ;


parent_slot = parent;


import_slot = import;

promote_slot = promote;

container_slot = container;

variable_slot = variable;

public_slot = public;

private_slot = private;

Abstract Syntax Tree

slots = parent_slot* promote_slot* container_slot* import_slot*

variable_slot* public_slot* private_slot*;

parent_slot = parent;

import_slot = import;

promote_slot = promote;

container_slot = container;

variable_slot = variable;

public_slot = public;

private_slot = private;

-------------------------------- End -----------------------------------------


Kevin


Thank you for your help.. tried it out and seems to be almost there, though
still getting an error.
Tried making a little example which replicates the problem.

------------------ code begin ------------------
Tokens

parent = 'parent';

import = 'import';

promote = 'promote';

container = 'container';

variable = 'variable';

public = 'public';

private = 'private';

Productions

object {-> slots} = slot*

{-> New slots([slot.parent_slot], [slot.promote_slot],

[slot.container_slot], [slot.import_slot], [slot.variable_slot],

[slot.public_slot], [slot.private_slot])};

slot {-> parent_slot promote_slot container_slot import_slot variable_slot
public_slot private_slot} =

{parent_slot} parent_slot {-> parent_slot Null Null Null Null Null Null} |

{promote_slot} promote_slot {-> Null promote_slot Null Null Null Null Null}
|

{container_slot} container_slot {-> Null Null container_slot Null Null Null
Null} |

{import_slot} import_slot {-> Null Null Null import_slot Null Null Null} |

{variable_slot} variable_slot {-> Null Null Null Null variable_slot Null
Null} |

{public_slot} public_slot {-> Null Null Null Null Null public_slot Null} |

{private_slot} private_slot {-> Null Null Null Null Null Null private_slot};

parent_slot = parent;

import_slot = import;

promote_slot = promote;

container_slot = container;

variable_slot = variable;

public_slot = public;

private_slot = private;

Abstract Syntax Tree

slots =

parent_slot* promote_slot* container_slot* import_slot*

variable_slot* public_slot* private_slot*;

parent_slot = parent;

import_slot = import;

promote_slot = promote;

container_slot = container;

variable_slot = variable;

public_slot = public;

private_slot = private;

------------------ code end ------------------

terminates with error: "[19,28] expecting PPromoteSlot when Null was found"

----- Original Message ----- From: "Etienne Gagnon" <gagnon.etienne_m@uqam.ca>
To: "Søren Andreasen" <sra@mail.dk>
Cc: <sablecc-list@sable.mcgill.ca>
Sent: Friday, April 30, 2004 15:31
Subject: Re: "alternative1 | alternative2" to " alternative1* alternative2*
" ast transformation





Hi Soeren,

First, your AST should be changed to:

/***********************************************************
§ MI 1.00.00 Abstract Syntax Tree root
***********************************************************/
object = slots;

/***********************************************************
§ MI 2.00.00 Global slots
***********************************************************/
slots =
  parent_slot* promote_slot* container_slot* import_slot*
    variable_slot* public_slot* private_slot*;


Now, here's alittle trick.



object =


  slot*
    {-> New slots([slot.parent_slot], [slot.promote_slot],
        [slot.container_slot], ...) };

slot
    {-> parent_slot promote_slot container_slot ... } =

  {parent_slot} parent_slot
    [-> parent_slot Null Null ... } |

  {promote_slot} promote_slot
    [-> Null promote_slot Null ... } |

  {container_slot} container_slot
    [-> Null Null container_slot ... } |
...


Have fun!


Etienne

Søren Andreasen wrote:


Hi,

I have a really big problem. My syntax does not require a bunch of
alternatives to appear in a specific order.
But I would like to sort them in my AST.

Somethin like:
-----------------------------------
Productions

/***********************************************************
§ MI 1.00.00 Abstract Syntax Tree root
***********************************************************/
object = slot*;

/***********************************************************
§ MI 2.00.00 Global slots
***********************************************************/
slot =
 {import_slot} import_slot |
 {variable_slot} variable_slot |
 {public_slot} public_slot |
 {private_slot} private_slot;

<...>

Abstract Syntax Tree

/***********************************************************
§ MI 1.00.00 Abstract Syntax Tree root
***********************************************************/
object = slot*;

/***********************************************************
§ MI 2.00.00 Global slots
***********************************************************/
slot = parent_slot* promote_slot* container_slot* import_slot*
variable_slot* public_slot* private_slot*;
-----------------------------------

No matter how I try I can't get it to work.. Please help!

Regards, Soeren





--
Etienne M. Gagnon, Ph.D.             http://www.info.uqam.ca/~egagnon/
SableVM:                                       http://www.sablevm.org/
SableCC:                                       http://www.sablecc.org/