Pyparsing Question
castironpi
castironpi at gmail.com
Fri May 16 11:43:52 EDT 2008
On May 16, 6:43 am, Ant <ant... at gmail.com> wrote:
> Hi all,
>
> I have a question on PyParsing. I am trying to create a parser for a
> hierarchical todo list format, but have hit a stumbling block. I have
> parsers for the header of the list (title and description), and the body
> (recursive descent on todo items).
>
> Individually they are working fine, combined they throw an exception.
> The code follows:
>
> #!/usr/bin/python
> # parser.py
> import pyparsing as pp
>
> def grammar():
> underline = pp.Word("=").suppress()
> dotnum = pp.Combine(pp.Word(pp.nums) + ".")
> textline = pp.Combine(pp.Group(pp.Word(pp.alphas, pp.printables) +
> pp.restOfLine))
> number = pp.Group(pp.OneOrMore(dotnum))
>
> headtitle = textline
> headdescription = pp.ZeroOrMore(textline)
> head = pp.Group(headtitle + underline + headdescription)
>
> taskname = pp.OneOrMore(dotnum) + textline
> task = pp.Forward()
> subtask = pp.Group(dotnum + task)
> task << (taskname + pp.ZeroOrMore(subtask))
> maintask = pp.Group(pp.LineStart() + task)
>
> parser = pp.OneOrMore(maintask)
>
> return head, parser
>
> text = """
>
> My Title
> ========
>
> Text on a longer line of several words.
> More test
> and more.
>
> """
>
> text2 = """
>
> 1. Task 1
> 1.1. Subtask
> 1.1.1. More tasks.
> 1.2. Another subtask
> 2. Task 2
> 2.1. Subtask again"""
>
> head, parser = grammar()
>
> print head.parseString(text)
> print parser.parseString(text2)
>
> comb = head + pp.OneOrMore(pp.LineStart() + pp.restOfLine) + parser
> print comb.parseString(text + text2)
>
> #===================================================================
>
> Now the first two print statements output the parse tree as I would
> expect, but the combined parser fails with an exception:
>
> Traceback (most recent call last):
> File "parser.py", line 50, in ?
> print comb.parseString(text + text2)
> .
> . [Stacktrace snipped]
> .
> raise exc
> pyparsing.ParseException: Expected start of line (at char 81), (line:9,
> col:1)
>
> Any help appreciated!
>
> Cheers,
>
> --
> Ant.
I hold that the + operator should be overloaded for strings to include
newlines. Python 3.0 print has parentheses around it; wouldn't it
make sense to take them out?
More information about the Python-list
mailing list