# [antlr-interest] Problems customizing tree construction

Mathilde GUERIN mathilde.guerin at gmail.com
Wed Jul 30 00:51:45 PDT 2008

```Hi,
I'm trying to write the grammar for the "Natural" Language
(http://en.wikipedia.org/wiki/Natural) and produce an AST.

Here's an example of a Natural program:
1 #FIELDA (A10)
1 #GROUPB
2 #FIELDB-A (N10)
2 #FIELDB-B (D)
1 #FIELDC (A15)
...
//The integer value represents the LEVEL of the variable to define the
data structure
//The (...) is used to define the FORMAT (type, length...) of the variable

To put it simply:
- #FIELDA is a variable (level 1 : highest level)
- #GROUPB is a group (level 1) composed of 2 variables //it can't
have a format... which is how i detect if this is a group or a
variable
* #FIELDB-A (level 2): first variable of the group
* #FIELDB-B (level 2): second variable of the group
- #FIELDC is an other variable (level 1).

Here's a summary of what i've done so far:
//1°) Custom Node Classes
public abstract class ASTNode extends CommonTree;
public class ASTVariable extends ASTNode;
public class ASTGroup extends ASTNode;

//2°) Grammar sample:
grammar
: (groupDefinition | varDefinition)+ ;
groupDefinition
: INT ID endLine+ -> ^(ID<ASTGroup>[\$INT.level]) ;
varDefinition
: INT ID format endLine+ -> ^(ID<ASTVariable>[\$INT.level] format) ;
...

//3°) produced AST:
ROOT <CommonTree>
|-#FIELDA   (level=1)  <ASTVariable>
|-#GROUPB   (level=1)  <ASTGroup>
|-#FIELDB-A (level=2)  <ASTVariable>
|-#FIELDA-B (level=2)  <ASTVariable>
|-#FIELDC   (level=1)  <ASTVariable>
----------------------------------------------------------------

What i'd like to get is something like this:

ROOT
|-#FIELDA        (level=1)  <ASTVariable>
|-#GROUPB        (level=1)  <ASTGroup>
|-#FIELDB-A  (level=2)  <ASTVariable>
|-#FIELDA-B  (level=2)  <ASTVariable>
|-#FIELDC        (level=1)  <ASTVariable>

My idea was to keep the ASTGroup node and the previous encountered
level as variables of the parser to use it to create the variable
node. Here's what I had in mind:
------------------------------------------------------------------------------------------------------

//-- ASTGroup creation --
/*generated code to create group node here...*/
// then initialize groupNode
groupNode = generatedNode;

/*...*/
//-- ASTVariable creation --
//if the variable level is lower than the group level,
if(groupNode != null && currentLevel < previousLevel){
//then the variable parent is the group node
adaptator.addChild(groupNode,varNode);
}
else {
//otherwise, the variable is one of the root child nodes and
groupNode is reinitialized
adaptator.addChild(root,varNode)
groupNode = null;
}
------------------------------------------------------------------------------------------------------
However, i haven't found a way to keep the created group node as a
Parser variable... :/
I'm not even sure this is the right solution (or even if it'd work)
but I don't know how to create such an AST since the construction
depends on the level of variables.

If someone could help me, that'd be really great...

Thanks in advance

~MG~
```

More information about the antlr-interest mailing list