[antlr-interest] Help please

wael sellami wael.sellami at gmail.com
Tue Mar 29 03:46:48 PDT 2011


Hello,
My name is Wael Sellami, I am a computer science researcher in Redcad
laboratory, university of sfax, tunisia, master level.
I use ANTLR to transform xml code to PROMELA code as input language of the
model-checker SPIN.
I have a problem in defining of nested bloc in my output. In fact, I can not
organize the output code as the form of input code. Below, there is a
exemple of small grammar and the rule of translation:

grammar xml;

options {
 output = AST;
 ASTLabelType = CommonTree;
 backtrack=true;
}

tokens {
ROOTDEF; NAMEDEF; XMLTAGDEF; TITLEDEF; BOOKDEF; AUTHORDEF; CHAPTDEF;}

grammar xml;

options {
 output = AST;
 ASTLabelType = CommonTree;
 backtrack=true;
}

tokens {
ROOTDEF; NAMEDEF; XMLTAGDEF; TITLEDEF; BOOKDEF; AUTHORDEF; CHAPTDEF;TITAUTH;
}

system : root+;

root :  '<books>' (xmltag)+ '</books>'
       -> ^(ROOTDEF (xmltag)+);

xmltag : book -> ^(XMLTAGDEF book) | title -> ^(XMLTAGDEF title) | author ->
^(XMLTAGDEF author) | chapter -> ^(XMLTAGDEF chapter);

book : '<book' name '>' (xmltag)+ '</book>'
-> ^(BOOKDEF name (xmltag)+) ;

title    : '<title' name '>' (ID)+ '</title>'
-> ^(TITLEDEF name (ID)+);

author    : '<author' name '>' (ID)+ '</author>'
-> ^(AUTHORDEF name (ID)+);

titleorother :    title ->^(TITAUTH title) | author ->^(TITAUTH author);

chapter    : '<chapter' name '>' (titleorother)+ '</chapter>'
-> ^(CHAPTDEF name (titleorother)+);

name     :  'name="' ID '"'
          -> ^(NAMEDEF ID);

ID  : ('a'..'z'|'A'..'Z'|'0'..'9') ('a'..'z'|'A'..'Z'|'0'..'9')*;
WS  : ( ' ' | '\t' | '\r' | '\n')* { $channel = HIDDEN; } ;



Then I have defined the tree walker:


tree grammar Translate;

options {
 tokenVocab = xml;
 ASTLabelType = CommonTree;
 output=template;

}

@members {
List<String> columnstagxml = new ArrayList<String>();

}



system : root+;

root :  ^(ROOTDEF (xmltag)+);

xmltag : ^(XMLTAGDEF book) | ^(XMLTAGDEF title) | ^(XMLTAGDEF author) |
^(XMLTAGDEF chapter);


book : ^(BOOKDEF name
{System.out.println("Begin book tag");}
(xmltag)+
{System.out.println("END book tag");}
)
;

title    returns [String tit]
    : ^(TITLEDEF name (ID)+)
{ System.out.println("The tilte of the book is:" + $name.namevar);
$tit=$name.namevar;
};

author    returns [String auth]
    : ^(AUTHORDEF name (ID)+)
{ System.out.println("The author of the book is:" +$name.namevar);
$auth=$name.namevar;
};

titleorother returns [String titlauth]
    :    ^(TITAUTH title){

        $titlauth= '\n' + "The title of this chapter is:" + $title.tit;
        columnstagxml.add($titlauth);
        }

        | ^(TITAUTH author)
        {
        $titlauth= '\n' + "The author of this chapter is:" + $author.auth;
        columnstagxml.add($titlauth);
        }
        ;

chapter    : ^(CHAPTDEF name (titleorother)+)
{
        Object[] arraycolumnstagxml = columnstagxml.toArray();
            for(int i = 0; i < arraycolumnstagxml.length; i++)
           {
            String x2=arraycolumnstagxml[i].toString();

        System.out.println(x2);
           }

};


name     returns [String namevar]
    : ^(NAMEDEF (ID)+)
    { $namevar = $ID.text;};







After that, I have tried with this input code:

<books>
    <title name="AAA"> Data base </title>
    <author name="BBB"> XML </author>

    <book name="a">
        <title name="CCC"> Data base </title>
        <author name="DDD"> XML </author>

                <chapter name="a">
                    <title name="EEE"> Data base </title>
                    <author name="FFF"> XML </author>
                    <author name="GGG"> XML </author>
                    <title name="HHH"> Data base </title>
                </chapter>
    </book>
</books>


So, the result of this translation which is false because there is the
displaying of title of the book, and may be the strcuture is wrong because
when ANTLR finds
a tag title shows ("The tilte of the book is:" + $name.namevar); but I need
to how reconize the source for each called tag.

The tilte of the book is:AAA
The author of the book is:BBB

Begin book tag
The tilte of the book is:CCC
The author of the book is:DDD
The tilte of the book is:EEE
The author of the book is:FFF
The author of the book is:GGG
The tilte of the book is:HHH

The title of this chapter is:EEE
The author of this chapter is:FFF
The author of this chapter is:GGG
The title of this chapter is:HHH
END book tag


But it's wrong, because normally, if we follow the input xml code the result
must be as follows :

The tilte of the book is:AAA
The author of the book is:BBB

Begin book tag
The tilte of the book is:CCC
The author of the book is:DDD

The title of this chapter is:EEE
The author of this chapter is:FFF
The author of this chapter is:GGG
The title of this chapter is:HHH
END book tag




Please, can you help me to distinguish the source tag of called tag
Thank you in advance for solving this problem.
Wael

-- 
---------------------------------------------
* Mr. Wael Sellami
* Master student
* Research Unit on Development and Control of Distributed Applications
(ReDCAD)
============================
-------------- next part --------------
A non-text attachment was scrubbed...
Name: XML2PROMELA.rar
Type: application/rar
Size: 44376 bytes
Desc: not available
Url : http://www.antlr.org/pipermail/antlr-interest/attachments/20110329/971b4d59/attachment.bin 


More information about the antlr-interest mailing list