pyparser and recursion problem

pyscottishguy at hotmail.com pyscottishguy at hotmail.com
Fri Jul 27 05:40:13 CEST 2007


Hey,

Thanks Neil and Paul!

After reading Neil's advice I started playing around with the
setParseAction method, and then I found Paul's script
'macroExpander.py' (http://pyparsing.wikispaces.com/space/showimage/
macroExpander.py).

With only a few modifications to macroExpander.py (and reversing my
string!) I had an almost complete answer of:

first [second1_1 second1_2 | second2 | second3 ] [third1 third2 |
[sixth1_1 sixth1_2 | sixth2 ]  ] | fourth [fifth1 | [[eighth1 |
eighth2] | seventh1]]

I was in the process of tyding this up so that I could do an eval() to
get the array when I saw Paul's answer (thanks!)

Here is macroExpander.py with my minimal changes:

#!/usr/bin/python

from pyparsing import *

# define the structure of a macro definition (the empty term is used
# to advance to the next non-whitespace character)
label = Suppress(":") + Word(alphas + "_").setResultsName("macro") +
Suppress(":")

values = restOfLine.setResultsName("value")

macroDef = label + empty + values

# define a placeholder for defined macros - initially nothing
macroExpr = Forward()

# global dictionary for macro definitions
macros = {}

# parse action for macro definitions
def processMacroDefn(s,l,t):
    macroVal = macroExpander.transformString(t.value)
    macros[t.macro] = macroVal
    macroExpr << MatchFirst( map(Keyword,macros.keys()) )

# parse action to replace macro references with their respective
definition
def processMacroRef(s,l,t):
    return '[' + macros[t[0]] +']'

# attach parse actions to expressions
macroExpr.setParseAction(processMacroRef)
macroDef.setParseAction(processMacroDefn)

# define pattern for scanning through the input string
macroExpander = macroExpr | macroDef

# test macro substitution using transformString
testString = """
:EIGHTH: eighth1 | eighth2

:SEVENTH: EIGHTH | seventh1

:SIXTH: sixth1_1 sixth1_2 | sixth2

:FIFTH: fifth1 | SEVENTH

:THIRD: third1 third2 | SIXTH

:SECOND: second1_1 second1_2 | second2 | second3

:Start: first SECOND THIRD | fourth FIFTH

"""

macroExpander.transformString(testString)

print macros['Start']





More information about the Python-list mailing list