XML. (was: Re: [ODE] outputting objects)

Martin C. Martin martin at metahuman.org
Tue Feb 4 10:36:01 2003


This is a multi-part message in MIME format.
--------------693E9A00AE7D14C2F772434B
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit



Anselm Hook wrote:
> 
> I'd still argue that the point is still not the xml itself - it is that
> you need some tool to map between *any* notation and C objects.  lets say
> that you have an xml file:
> 
>   <ode:body>
>      <position>0 0 0</position>
>   </ode:body>
> 
> how do you pluck out and apply position to the ode object without having
> to hand write code?  do you write code like this:
> 
>    for( all xml nodes ) {
>      if( mode is body )
>        if( node is position )
>           body->position = parse_field
>    }
> 
> clearly this would be a large mass of messy code.

Yeah, what you really need is a parser generator, like yacc, but that
generates top down parsers.  Recursive descent parsers would be ideal.

I just use yacc and a lot of copying, and a lex file I got off the web. 
I've included it here.

- Martin
--------------693E9A00AE7D14C2F772434B
Content-Type: application/x-unknown-content-type-LEXFile;
 name="xml.lex"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="xml.lex"

LyogVG8gY29tcGlsZToNCiAgIA0KICAgZmxleCB4bWwubGV4DQogICBtdiBsZXgueXkuYyBs
ZXgueXkuY3BwDQogICBnKysgbGV4Lnl5LmNwcA0KICAgKi8NCg0KDQovKiBSRVgvTGV4IDEu
MCANCiAgIFJvYmVydCBELiBDYW1lcm9uICJSRVg6IFhNTCBTaGFsbG93IFBhcnNpbmcgd2l0
aCBSZWd1bGFyIEV4cHJlc3Npb25zIiwNCiAgIFRlY2huaWNhbCBSZXBvcnQgVFIgMTk5OC0x
NywgU2Nob29sIG9mIENvbXB1dGluZyBTY2llbmNlLCBTaW1vbiBGcmFzZXIgDQogICBVbml2
ZXJzaXR5LCBOb3ZlbWJlciwgMTk5OC4NCiAgIENvcHlyaWdodCAoYykgMTk5OCwgUm9iZXJ0
IEQuIENhbWVyb24uIA0KICAgVGhlIGZvbGxvd2luZyBjb2RlIG1heSBiZSBmcmVlbHkgdXNl
ZCBhbmQgZGlzdHJpYnV0ZWQgcHJvdmlkZWQgdGhhdA0KICAgdGhpcyBjb3B5cmlnaHQgYW5k
IGNpdGF0aW9uIG5vdGljZSByZW1haW5zIGludGFjdCBhbmQgdGhhdCBtb2RpZmljYXRpb25z
DQogICBvciBhZGRpdGlvbnMgYXJlIGNsZWFybHkgaWRlbnRpZmllZC4NCiAgIA0KICAgU25h
cmZlZCBmcm9tIGh0dHA6Ly9mYXMuc2Z1LmNhL3B1Yi9jcy90ZWNocmVwb3J0cy8xOTk4L0NN
UFQxOTk4LTE3Lmh0bWwgb24gQXVndXN0IDIzLCAyMDAyLiAqLw0KICAgDQogICANCiV7DQoj
aWZkZWYgX01TQ19WRVINCiNkZWZpbmUgWVlfTkVWRVJfSU5URVJBQ1RJVkUgMQ0KI2VuZGlm
DQoNCiNpbmNsdWRlICJYTUxMZXhlci5oIg0KDQojaW5jbHVkZSA8YXNzZXJ0Lmg+DQojaW5j
bHVkZSA8Y3R5cGUuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxpb3N0cmVh
bT4NCg0KdXNpbmcgbmFtZXNwYWNlIHN0ZDsNCg0KdW5pb24gUGFyc2VEYXRhIHl5bHZhbDsN
Cg0KaW50IG1hdGNoX3doaXRlKGNvbnN0IGNoYXIgKnRleHQsIGludCBsZW4sIGludCBzdGFy
dCk7DQppbnQgZ2V0X25hbWUoY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbiwgaW50IHN0YXJ0
KTsNCmludCBnZXRfYXR0cmlidXRlX3ZhbHVlKGNvbnN0IGNoYXIgKnRleHQsIGludCBsZW4s
IGludCBzdGFydCk7DQoNCiV9DQoNCiVvcHRpb24gbm95eXdyYXANCg0KVGV4dFNFCQlbXjxd
Kw0KVW50aWxIeXBoZW4JW14tXSotDQpVbnRpbDJIeXBoZW5zCXtVbnRpbEh5cGhlbn0oW14t
XXtVbnRpbEh5cGhlbn0pKi0NCkNvbW1lbnRDRQl7VW50aWwySHlwaGVuc30+Pw0KVW50aWxS
U0JzCVteXF1dKl0oW15cXV0rXSkqXSsNCkNEQVRBX0NFCXtVbnRpbFJTQnN9KFteXF0+XXtV
bnRpbFJTQnN9KSo+DQpTCQlbIFxuXHRccl0rDQpOYW1lU3RydAlbQS1aYS16XzpdfFteXHgw
MC1ceDdGXQ0KTmFtZUNoYXIJW0EtWmEtejAtOV86Li1dfFteXHgwMC1ceDdGXQ0KTmFtZQkJ
KHtOYW1lU3RydH0pKHtOYW1lQ2hhcn0pKg0KUXVvdGVTRQkJXCJbXiJdKlwifCdbXiddKicN
CkRUX0lkZW50U0UJe1N9e05hbWV9KHtTfSh7TmFtZX18e1F1b3RlU0V9KSkqDQpNYXJrdXBE
ZWNsQ0UJKFteXF0iJz48XSt8e1F1b3RlU0V9KSo+DQpTMQkJW1xuXHJcdCBdDQpVbnRpbFFN
cwlbXj9dKlw/Kw0KUElfVGFpbAkJXD8+fHtTMX17VW50aWxRTXN9KFtePj9de1VudGlsUU1z
fSkqPg0KRFRfSXRlbVNFCVw8KCEoLS17VW50aWwySHlwaGVuc30+fFteLV17TWFya3VwRGVj
bENFfSl8XD97TmFtZX0oe1BJX1RhaWx9KSl8JXtOYW1lfTt8e1N9DQpEb2NUeXBlQ0UJe0RU
X0lkZW50U0V9KHtTfSk/KFxbKHtEVF9JdGVtU0V9KSpdKHtTfSk/KT8+Pw0KRGVjbENFCQkt
LSh7Q29tbWVudENFfSk/fFxbQ0RBVEFcWyh7Q0RBVEFfQ0V9KT98RE9DVFlQRSh7RG9jVHlw
ZUNFfSk/DQpQSV9DRQkJe05hbWV9KHtQSV9UYWlsfSk/DQpFbmRUYWdDRQl7TmFtZX0oe1N9
KT8+Pw0KQXR0VmFsU0UJXCJbXjwiXSpcInwnW148J10qJw0KRWxlbVRhZ0NFCXtOYW1lfSh7
U317TmFtZX0oe1N9KT89KHtTfSk/KHtBdHRWYWxTRX0pKSooe1N9KT9cLz8+Pw0KTWFya3Vw
U1BFCVw8KCEoe0RlY2xDRX0pP3xcPyh7UElfQ0V9KT98XC8oe0VuZFRhZ0NFfSk/fCh7RWxl
bVRhZ0NFfSk/KQ0KWE1MX1NQRQkJe1RleHRTRX18e01hcmt1cFNQRX0NCg0KJSUNCg0Ke1Rl
eHRTRX0JeyB5eWx2YWwuc3RyaW5nID0geXl0ZXh0OyByZXR1cm4gQ0hBUkFDVEVSUzsgfQ0K
XDwhKHtEZWNsQ0V9KT8JeyB5eWx2YWwuc3RyaW5nID0geXl0ZXh0OyByZXR1cm4gREVDTEFS
QVRJT047IH0NClw8XD8oe1BJX0NFfSk/CXsgeXlsdmFsLnN0cmluZyA9IHl5dGV4dDsgcmV0
dXJuIFBST0NFU1NJTkdfSU5TVFJVQ1RJT047IH0NCg0KXDxcLyh7RW5kVGFnQ0V9KT8Jew0K
CWludCBlbmQ7DQoJDQoJaWYgKHl5dGV4dFt5eWxlbmcgLSAxXSAhPSAnPicpIHsNCgkgICB5
eWx2YWwuc3RyaW5nID0gTlVMTDsNCgkgICByZXR1cm4gRUxFTUVOVF9FTkQ7DQoJfQ0KCQ0K
CXl5bHZhbC5zdHJpbmcgPSB5eXRleHQgKyAyOw0KCS8vIFNraXAgdHJhaW5pbmcgc3BhY2Vz
DQoJZm9yIChlbmQgPSB5eWxlbmcgLSAyOyBlbmQgPiAyICYmIGlzc3BhY2UoeXl0ZXh0W2Vu
ZF0pOyBlbmQtLSkNCgkgICA7DQoJeXl0ZXh0W2VuZCsxXSA9ICdcMCc7DQoJcmV0dXJuIEVM
RU1FTlRfRU5EOw0KfQ0KDQpcPCh7RWxlbVRhZ0NFfSk/CXsNCglpbnQgY2hhcnNfbWF0Y2hl
ZDsNCglpbnQgcG9zID0gMTsgLy8gc2tpcCBsZWFkaW5nICI8Ig0KCWNoYXIgbmV4dF9jaGFy
Ow0KDQoJY2hhcnNfbWF0Y2hlZCA9IGdldF9uYW1lKHl5dGV4dCwgeXlsZW5nLCBwb3MpOw0K
CWlmIChjaGFyc19tYXRjaGVkID09IDApDQoJCXJldHVybiAtMTsNCg0KCXl5bHZhbC5lbGVt
ID0gbmV3IEVsZW1lbnRTdGFydDsNCgluZXh0X2NoYXIgPSB5eXRleHRbcG9zICsgY2hhcnNf
bWF0Y2hlZF07DQoJeXl0ZXh0W3BvcyArIGNoYXJzX21hdGNoZWRdID0gJ1wwJzsNCgl5eWx2
YWwuZWxlbS0+bmFtZSA9ICZ5eXRleHRbcG9zXTsNCglwb3MgKz0gY2hhcnNfbWF0Y2hlZCAr
IDE7DQoNCglpZiAobmV4dF9jaGFyID09ICcvJyB8fCBuZXh0X2NoYXIgPT0gJz4nKSB7DQoJ
ICAgeXlsdmFsLmVsZW0tPmVuZCA9IChuZXh0X2NoYXIgPT0gJy8nKTsNCgkgICByZXR1cm4g
RUxFTUVOVF9TVEFSVDsNCgl9DQoNCglmb3IoOzspIHsNCgkgICBwb3MgPSBtYXRjaF93aGl0
ZSh5eXRleHQsIHl5bGVuZywgcG9zKTsNCgkNCgkgICBjaGFyc19tYXRjaGVkID0gZ2V0X25h
bWUoeXl0ZXh0LCB5eWxlbmcsIHBvcyk7DQoJICAgaWYgKGNoYXJzX21hdGNoZWQgPT0gMCkN
CgkgICAgICBicmVhazsNCg0KCSAgIGNoYXIgbmV4dF9jaGFyID0geXl0ZXh0W3BvcyArIGNo
YXJzX21hdGNoZWRdOw0KCSAgIHl5dGV4dFtwb3MgKyBjaGFyc19tYXRjaGVkXSA9ICdcMCc7
DQoNCgkgICB5eWx2YWwuZWxlbS0+YXR0cmlidXRlcy5wdXNoX2JhY2soJnl5dGV4dFtwb3Nd
KTsNCgkgICBwb3MgKz0gY2hhcnNfbWF0Y2hlZCArIDE7DQoNCgkgICBpZiAobmV4dF9jaGFy
ICE9ICc9Jykgew0KCSAgICAgIHBvcyA9IG1hdGNoX3doaXRlKHl5dGV4dCwgeXlsZW5nLCBw
b3MpOw0KCSAgIA0KCSAgICAgIGFzc2VydCh5eXRleHRbcG9zXSA9PSAnPScpOw0KCSAgICAg
IHBvcysrOw0KCSAgIH0NCgkgICANCgkgICBwb3MgPSBtYXRjaF93aGl0ZSh5eXRleHQsIHl5
bGVuZywgcG9zKTsNCgkgICANCgkgICBjaGFyc19tYXRjaGVkID0gZ2V0X2F0dHJpYnV0ZV92
YWx1ZSh5eXRleHQsIHl5bGVuZywgcG9zKTsNCgkgICBhc3NlcnQgKGNoYXJzX21hdGNoZWQg
Pj0gMik7DQoJICAgeXl0ZXh0W3BvcyArIGNoYXJzX21hdGNoZWQgLSAxXSA9ICdcMCc7DQoJ
ICAgeXlsdmFsLmVsZW0tPmF0dHJpYnV0ZXMucHVzaF9iYWNrICgmeXl0ZXh0W3BvcyArIDFd
KTsNCgkgICBwb3MgKz0gY2hhcnNfbWF0Y2hlZDsNCgl9DQoJDQoJLyogVGhlIHJlbWFpbmlu
ZyBjaGFyYWN0ZXJzIGFyZSBlaXRoZXIgIi8+IiBvciAiPiIuICovDQoJYXNzZXJ0KHl5dGV4
dFtwb3NdID09ICc+JyB8fCB5eXRleHRbcG9zXSA9PSAnLycpOw0KCQ0KCXl5bHZhbC5lbGVt
LT5lbmQgPSAoeXl0ZXh0W3Bvc10gPT0gJy8nKTsNCg0KCXJldHVybiBFTEVNRU5UX1NUQVJU
Ow0KfQ0KDQolJQ0KDQppbnQgbWF0Y2hfd2hpdGUoY29uc3QgY2hhciAqdGV4dCwgaW50IGxl
biwgaW50IHN0YXJ0KQ0Kew0KICAgd2hpbGUgKHN0YXJ0IDwgbGVuICYmIGlzc3BhY2UodGV4
dFtzdGFydF0pKSANCiAgIAlzdGFydCsrOw0KICAgcmV0dXJuIHN0YXJ0Ow0KfQ0KDQovLyBS
ZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgbmFtZS4NCmludCBnZXRf
bmFtZShjb25zdCBjaGFyICp0ZXh0LCBpbnQgbGVuLCBpbnQgc3RhcnQpDQp7DQogICBpbnQg
cG9zID0gc3RhcnQ7DQogICANCiAgIHdoaWxlIChwb3MgPCBsZW4gJiYgaXNhbG51bSh0ZXh0
W3Bvc10pIHx8IHRleHRbcG9zXSA9PSAnLScgfHwNCiAgICAgIHRleHRbcG9zXSA9PSAnOicg
fHwgdGV4dFtwb3NdID09ICdfJyB8fCB0ZXh0W3Bvc10gPT0gJy4nKSANCiAgIHsNCiAgICAg
IHBvcysrOw0KICAgfQ0KICAgcmV0dXJuIHBvcyAtIHN0YXJ0Ow0KfQ0KDQovLyBSZXR1cm5z
IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBtYXRjaGVkLCBpbmNsdWRpbmcgdGhlIHN1cnJv
dW5kaW5nIHF1b3Rlcy4NCmludCBnZXRfYXR0cmlidXRlX3ZhbHVlKGNvbnN0IGNoYXIgKnRl
eHQsIGludCBsZW4sIGludCBzdGFydCkNCnsNCiAgIGNoYXIgZGVsaW1pdGVyOw0KICAgaW50
IHBvczsNCiAgIA0KICAgZGVsaW1pdGVyID0gdGV4dFtzdGFydF07DQogICBhc3NlcnQoZGVs
aW1pdGVyID09ICciJyB8fCBkZWxpbWl0ZXIgPT0gJ1wnJyk7DQogICBwb3MgPSBzdGFydCAr
IDE7DQogICANCiAgIHdoaWxlIChwb3MgPCBsZW4gJiYgdGV4dFtwb3NdICE9IGRlbGltaXRl
cikNCiAgICAgIHBvcysrOw0KICAgaWYgKHBvcyA+PSBsZW4pDQogICAgICByZXR1cm4gMDsN
CiAgICAgIA0KICAgcmV0dXJuIHBvcyAtIHN0YXJ0ICsgMTsNCn0NCg0KLyppbnQgbWFpbiAo
aW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCnsNCiAgIHdoaWxlICh5eWxleCgpICE9IDApDQog
ICAgICA7DQogICAgICANCiAgIHJldHVybiAwOw0KfSovDQo=
--------------693E9A00AE7D14C2F772434B--