osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

parsley parsing question


how do you parse multi line text with parsley?  here is a work in 
progress and I'm trying to figure out why I need to split the text and 
process per line vrs all at one go.

thanks for any help.
--- eric

Here's the whole body of code ---------------------------

import parsley
#
# grammar to parse
#
# uses<ws><keyword><argument><eol>
# template<ws><template name>
# returns<ws>(<stdout>|file: <filename>|<storage name>)
# remembers<ws><storage name>

# alt form
# template<ws><template name>[:<storage name>]

# test targets

def do_uses(a,b):
     print "do_uses %s - %s -"% (a,b)
def do_returns(a):
     print "do_returns %s"% (a)
def do_template(a):
     print "do_templates %s"% (a)

# parsleyfied grammar
TF_grammar = r"""
kwToken = (letter|digit|'_')*
uses_statement = 'uses' ws kwToken:kwT ':' anything*:roL '\n'{0,1} -> 
do_uses ("".join(kwT), "".join(roL))
returns_statement = 'returns' ws kwToken:kwT '\n'{0,1} -> 
do_returns("".join(kwT))
template_statement = 'template' ws kwToken:kwT '\n'{0,1} -> 
do_template("".join(kwT))
bow = (uses_statement | returns_statement | template_statement) ws
"""
#
action_table = {
     "do_uses": do_uses,
     "do_returns": do_returns,
     "do_template": do_template,
     }

# alt path: split lines and parse them one at time

def run_bot(body_of_text):
     """break up the body of text"""
     for i in body_of_text.split("\n"):
         if len(i) != 0:  # why is this test needed?
             x = parsley.makeGrammar(TF_grammar,action_table)
             x(i).bow()

xxx="""uses foo: this is some text
returns xyzzy
template templatename
"""
# multi-line solution
x = parsley.makeGrammar(TF_grammar,action_table)
x(xxx).bow()

test line-at-a-time solution
run_bot(xxx)

----------  bad result (multi-line) is -----------

$ python parsleytest.py
do_uses foo -  this is some text
returns xyzzy
template templatename
  -

-------- good result should be -------

$ python parsleytest.py
do_uses foo  this is some text
do_returns xyzzy
do_template template templatename