XML parser/unparser generator
Oversigt
parsegen er en oversættergenerator skrevet i Java. Den generer en, givet en grammatik G, en oversætter fra sproget G til XML. Ud fra G genereres der samtidig to XML skema filer, en XML Schema og en RELAX NG fil. Disse to skema filer kan bruges til at bestemme om XML dokumenter tilhører oversatte instanser af G.
Implementationen er ligeledes "online", i den forstand at der ikke opbygges nogen datastrukturer i lagret, men at XML dokumentet oversættes løbende, som det parses ind. Dermed opnås et lille og konstant lagerforbrug.
Eksempler
Følgende er et par eksempler. Bemærk at alle filetyper er blevet ændret
til .txt, for at sikrer de serveres med en mime-type,
som vises i browseren. Dette skulle gøre inspektion af filerne lidt
nemmere. Disse endelser kan altså blot fjernes, hvis filerne hentes
ned på computeren.
| Sprog | Grammatik | Instans | XML | XML Schema | RELAX NG |
| Simple regneudtryk | expr.pp | expr.exp | expr.exp.xml | expr.xsd | expr.rng |
| BibTeX | bibtex.pp | bibliography.bib | bibliography.bib.xml | bibtex.xsd | bibtex.rng |
| Java 1.4 | java.pp | Hello.java | Hello.java.xml | java.xsd | java.rng |
Det skal bemærkes at der er kørt tidy på
alle de ovenstående XML filer (tidy -m -i -xml fil), for at lette inspektionen af filerne.
Under normale omstændigheder laves der ikke nogen indentering, og
kun få linieskift, som blot skal afhjælpe debugging (aflusning).
Brugervejledning
For at lave en oversætte, hentes parsegen.zip, og udpakkes til en passende folder. Programmet er testet og fungere med Java 1.4.2_08.
Der er to filer, makegenerator, og makeparser,
i batch fil, og shell script versioner, alt efter Windows og Unix systemer.
Husk i Unix at kører chmod +x *.sh på de to shell script filer.
Vigtigt: grundet en lidt ustandard måde at lave
jar pakker på, skal der i make filerne refereres til tools.jar, fra
Java SDK'en (i sdkroot/lib/tools.jar).
- Linie 12 i
makegenerator, erstatC:\j2sdk1.4.2_08\lib\tools.jareller/opt/sun-jdk-1.4.2.05/lib/tools.jarmed passende sti. - Linie 4 i
makeparser, erstatC:\j2sdk1.4.2_08\lib\tools.jareller/opt/sun-jdk-1.4.2.05/lib/tools.jarmed passende sti.
Du er nu klar til at oversætte parsergeneratoren, vha. makegenerator.
kør filen, og der skulle skabes en classes mappe, som indeholder
de oversatte .class filer. Herefter kan makeparser køres, for
at lave de reelle oversættere. makeparser tager et argument, en grammatikfil.
Disse skal lægges i input mappen (der medfølger et par grammatikker i zip filen), hvorefter parseren laves via makeparser:
./makeparser.sh grm.pp (Unix) makeparser.bat grm.pp (Windows)
Derefter ligger der i output mappen tre filer:
grm.jarOversætter fra G => XMLgrm.rngRELAX NG skema filgrm.xsdXML Schema skema fil.
grm.jar kan nu bruges til at oversætte instanser af G således:
java -cp grm.jar Main fil
Den resulterende XML kaldes fil.xml.
Til validering af fil.xml er der både
XML Schema og RELAX NG skema filer. RELAX NG kan valideres med
Jing, som
har en nem syntax og anvendelse. Til XML Schema er det lidt mere
besværligt, og vi har lavet en script fil til Windows, som
tester et XML dokument, op imod et skema. schema-msxml-val.js.
Den køres ved "cscript schema-msxml-val.js fil.xml grm.xsd".
Scriptet kræver MSXML 4.
Baggrund
Efterhånden som XML fremstår som det aktuelle lingua franca for både datamodellering og applikationsprotokoller, er det en naturlig udfordring at genfortolke gammelkendte datastrukturer og processer i XML. Hertil vil dette projekt forsøge at bidrage, ved netop at tillade nem adgang til, normalt utilgængelige, datastrukturer i XML.
I rapporten defineres oversættelsen, og diverse teknisk overvejelser om online-aspektet laves. Der forklares derudover om trægrammatikker (XML dokumenter er træer, og skal der ræsoneres over disses struktur, skal man bruge trægrammatikker), og på det fundament udpensles de to skema sprogs udtryksfuldhed, og ligeledes gives der en argumentation for at et skema dokument kun vil validere en fil, hvis det kommer fra sproget af G, altså at skema filen ikke acceptere noget større eller mindrer sprog.
Grammatikkerne som accepteres er LL(1), omend det er muligt at benytte funktionalitet i backend parsergeneratoren (som er JavaCC), for at lave en grammatik som er LL(k), dette ses f.eks. i Java 1.4 grammatikken.
Skrifteligt materiale
Rapporten kommer i to version, bemærk dog pdf versionens størrelse.
- rapport.ps (2.77 mb)
- rapport.pdf (11.4 mb)
På projektets tilknyttede Wiki kan der findes elektroniske kopier af de (fleste) referencer der er blevet brugt til projektet.
Programmel
parsegen.zip, inklusiv kildekode (2.36 mb)schema-msxml-val.js(1.18 kb)
Projektdeltagere
Projektet er skrevet som bachelor projekt på DIKU, af følgende deltagere:
- Svend Ezaki Tofte,
svend at diku.dk(ellersvend at svendtofte.com) - Pimin Konstantin Kefaloukos,
kostas at diku.dk - Troels Parbst,
troels at slacker.dk
Er der nogen problemer kan vi kontaktes på ovenstående e-mail addresser, og er der problemer med websiden kan Svend Tofte kontaktes.