R++ based XML Generator.
Steven T. Hatton
hattons at globalsymmetry.com
Sat Sep 3 08:18:03 UTC 2005
On Friday 02 September 2005 19:35, Steven T. Hatton wrote:
> I created an XML generator derived from the r++ DefalutVisitor. Someone
> may find it modestly useful. If nothing else, it might be useful as a
> cut-n-paste template for something that is actually useful.
>
> There are a few things commented out, and a few more that probably should
> be commented out. If an attribute is commented out, or if the value
> parameter to sth::XmlTree::_setAttribute(name, value) is quoted, that means
> something wasn't working either in my code, or in r++.
I now have a function that creates a diagnostic element in the XML holding
arbitrary text. I am pushing a description of any token that seems to be
producing wrong results to a diagnostic element under the element
representing the AST node where it appears.
What seems to be happening is that in AST nodes which have a member variable
intended to hold a token stream index, but for which no corresponding token
exists the variable holds garbage.
The ones I've identified so far are:
UnqualifiedName
ParameterDeclarationClause
SimpleTypeSpecifier
PrimaryExpression
Something I did with some code I wrote to parse an ELF file was this:
//In a header file I did:
#ifndef ELF32_EHDR_H
#define ELF32_EHDR_H
#include "Types.h"
namespace sth {
namespace elf32 {
struct Elf32_Ehdr_base {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
protected:
static const Elf32_Ehdr_base Z;
};
struct Elf32_Ehdr: Elf32_Ehdr_base { Elf32_Ehdr(); };
}
}
//Then in a source file I did:
#include "Elf32_Ehdr.h"
namespace sth {
namespace elf32{
const Elf32_Ehdr_base Elf32_Ehdr_base::Z = {};
Elf32_Ehdr::Elf32_Ehdr():Elf32_Ehdr_base(Z){}
}
}
#endif
I believe that is the code that actually worked. If not, it's very close.
Unfortunately, I yanked it because at the time, I reasoned that "I know what
I'm doing, so I won't need this". I'm not sure that was a good idea.
I'm not sure if there's anything wrong with the current r++ AST, or if I just
don't understand it. The approach shown above might be useful to someone if
they do think the AST nodes should be zero-initialized. A factory approach
might also work. Of course, they could always be initialized per instance
when created.
> My code is here:
>
> http://baldur.globalsymmetry.com/open-source/org/kde/kdevelop/rxx/sth/
> All that the code currently does is create a QDomDocument and streams it to
> a std::ostream passed as a parameter to the constructor. This is an example
> of the XML generated:
>
http://baldur.globalsymmetry.com/open-source/org/kde/kdevelop/rxx/HelloWorld.xml
> I find the default xml rendering provided by Mozilla to be a useful means
> of viewing the file. KXMLEditor also works well.
>
> If I've accomplished nothing else, I've demonstrated that r++'s AST makes a
> very pretty dot graph:
>
> http://baldur.globalsymmetry.com/open-source/org/kde/kdevelop/rxx/doc/html/
>inherits.html
>
> To get the really cool frames for the Doxygen output go here:
>
> http://baldur.globalsymmetry.com/open-source/org/kde/kdevelop/rxx/doc/html/
>index.html
--
Regards,
Steven
More information about the KDevelop-devel
mailing list