pyparsing problem
Paul McGuire
ptmcg at austin.rr.com
Tue Jul 1 10:05:55 EDT 2008
On Jul 1, 8:02 am, name <x... at y.z> wrote:
> Hi,
>
> I try to parse a file with pyparsing and get this output:
>
> ['generic', 'host-01', 'host alias xyz', '10.0.0.1']
> - alias: host alias xyz
> - host_name: ['host-01']
> - ip_address: ['10.0.0.1']
> - use: ['generic']
>
> <Hosts>
> <ITEM>generic</ITEM>
> <host_name>host-01</host_name>
> <alias>host alias xyz</alias>
> <ip_address>10.0.0.1</ip_address>
> </Hosts>
>
> ['generic', 'host-01', 'host alias xyz', '10.0.0.1']
>
> finished
>
> What I don't understand is why I get the line
>
> <ITEM>generic</ITEM>
>
> and not
>
> <use>generic</use>
>
> as there is an associated name in the dump() output.
>
> Thank you very much in advance for any clue or help you could
> provide.
>
> The code:
> ---------
>
> #!/usr/bin/env python
>
> from pyparsing import *
>
> sample = """
> define host{
> use generic
> host_name host-01
> alias host alias xyz
> address 10.0.0.1}
>
> """
>
> # define tokens
> LBRACE,RBRACE = map(Suppress, '{}')
> ipAddress = Combine(Word(nums) + ('.' + Word(nums))*3)
> useTemplate = oneOf('generic user')
>
> # define grammar
>
> deviceName = Word(alphanums+'-')
> hostDef = Literal('define').suppress() + Literal('host').suppress()
> useLine = Suppress('use') + useTemplate + Suppress(SkipTo(lineEnd))
> host_nameLine = Suppress('host_name') + deviceName + Suppress(SkipTo
> (lineEnd))
> aliasLine = Suppress('alias') + SkipTo(lineEnd)
> aliasLine.setParseAction(lambda x: ' '.join(x[0].split()))
> ip_addressLine = Suppress('address') + ipAddress
>
> use = useLine.setResultsName('use')
> host_name = host_nameLine.setResultsName('host_name')
> alias = aliasLine.setResultsName('alias')
> ip_address = ip_addressLine.setResultsName('ip_address')
>
> host_stmt = (use + host_name + alias + ip_address)
> host = hostDef + LBRACE + host_stmt + RBRACE
>
> test_file = OneOrMore(host) + stringEnd
>
> # test
> x = test_file.parseString(sample)
> print x.dump()
> print
> print x.asXML('Hosts')
> print
> print x.asList()
> print
>
> print 'finished'
Looks like this is a bug in asXML(). Note that if I reverse the use
and host_name strings in the input and in your grammar, I get this XML
output:
<Hosts>
<ITEM>host-01</ITEM>
<use>generic</use>
<alias>host alias xyz</alias>
<ip_address>10.0.0.1</ip_address>
</Hosts>
Fortunately, you have provided a nice short test case, which should
allow me to track down the problem.
Thanks,
-- Paul
More information about the Python-list
mailing list