Say you’ve got a bunch of different XML formats that you need to read into internal data structures. You could sit down and code a SAX parser from scratch. You could use a DOM parser and then wander through the DOM filling in your internal data structures. Or, you could write a little snippet describing how you’d like to turn your XML into structures and run this parser generator.
Currently, this parser generator will generate SAX-based parsers for Lisp or Objective-C and create all of the necessary data types for your internal structures based on your input file.
Obtaining the code
- ASDF-Install: (asdf-install:install :com.nklein.parser-generator)
- Latest release: parser-generator_1.0.2010.04.09.tar.gz with GPG signature.
- Main Git repository: http://git.nklein.com/lisp/apps/parser-generator.git
- Browsable Git mirror: http://github.com/nklein/com.nklein.parser-generator
Examples
Here is a simple example. Suppose you wanted to parse the following snippet of XML:
<dining-room>
<manufacturer>The Wood Shop</manufacturer>
<table type="round" wood="maple">
<price>$199.99</price>
</table>
<chair wood="maple">
<quantity>6</quantity>
<price>$39.99</price>
</chair>
</dining-room>
You might think of this as a dining room with a manufacturer, a table, and a chair. If so, then you could use this input for the parser generator: dining_room_direct.xml to parse it into structures like this:
string shape;
string wood;
string price;
}
struct Chair {
integer quantity;
string wood;
string price;
}
struct DiningRoom {
string manufacturer
Table table;
Chair chair;
}
You might think of this as a dining room with a manufacturer and an array of table and chair entities. If so, then you could use this input for the parser generator: dining_room_het.xml to parse it into structures like this:
string shape;
string wood;
string price;
}
struct Chair {
integer quantity;
string wood;
string price;
}
struct DiningRoom {
string manufacturer
array pieces; // pieces are either Table or Chair instances
}
Or, you might think of this as a dining room with a manufacturer and some furniture. In that case, you can use this input for the parser generator: dining_room_hom.xml to parse it into structures like this:
string shape; // defaults to ""
string wood;
integer quantity; // defaults to 1
string price;
}
struct DiningRoom {
string manufacturer
array pieces; // pieces are all furniture, either from <table>
// or <chair>
}