pyparsing problem

Paul McGuire ptmcg at austin.rr.com
Tue Jul 1 16:05:55 CEST 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