"David Hirschfield" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > Anyone out there use simpleparse? If so, I have a problem that I can't > seem to solve...I need to be able to parse this line: > > """Cen2 = Cen(OUT, "Cep", "ies", wh, 544, (wh/ht));""" > > with this grammar: > > grammar = r''' > declaration := ws, line, (ws, line)*, ws > line := (statement / assignment), ';', ws > assignment := identifier, ws, '=', ws, statement > statement := identifier, '(', arglist?, ')', chars? > identifier := ([a-zA-Z0-9_.:])+ > arglist := arg, (',', ws, arg)* > arg := expr/ statement / identifier / num / str / > curve / spline / union / conditional / definition > definition := typedef?, ws, identifier, ws, '=', ws, arg > typedef := ([a-zA-Z0-9_])+ > expr := termlist, ( operator, termlist )+ > termlist := ( '(', expr, ')' ) / term > term := call / identifier / num > call := identifier, '(', arglist?, ')' > union := '{{', ws, (arg, ws, ';', ws)*, arg, ws, '}}' > operator := ( '+' / '-' / '/' / '*' / > '==' / '>=' / '<=' / '>' / '<' ) > conditional := termlist, ws, '?', ws, termlist, ws, ':', ws, termlist > curve := (list / num), '@', num > spline := (cv, ',')*, cv > cv := identifier, '@', num > list := '[', arg, (',', ws, arg)*, ']' > str := '"', ([;] / chars)*, '"' > num := ( scinot / float / int ) > <chars> := ('-' / '/' / '?' / [EMAIL PROTECTED]&\*\+=<> :])+ > <int> := ([-+]?, [0-9]+) > <float> := ([-+]?, [0-9\.]+) > <scinot> := (float, 'e', int) > <ws> := [ \t\n]* > ''' <snip> >
David - I converted your simpleparse grammar to pyparsing, which I could then troubleshoot. Here is a working pyparsing grammar, perhaps you can convert it back to simpleparse form and see if you make any better progress. -- Paul test = """Cen2 = Cen(OUT, "Cep", "ies", wh, 544, (wh/ht));""" from pyparsing import * # recursive items need forward decl - assign contents later using '<<' operator arg = Forward() expr = Forward() statement = Forward() float_ = Regex (r"[-+]?[0-9]+\.[0-9]*") int_ = Regex (r"[-+]?[0-9]+") scinot = Combine(float_ + oneOf(list("eE")) + int_) num = scinot | float_ | int_ str_ = dblQuotedString list_ = "[" + delimitedList(arg) + "]" identifier = Word(alphas, srange("[a-zA-Z0-9_.:]")) cv = identifier + "@" + num spline = delimitedList(cv) curve = (list_ | num) + "@" + num conditional = expr + "?" + expr + ":" + expr operator = oneOf( ('+', '-', '/', '*', '==', '>=', '<=', '>', '<') ) union = "{{" + delimitedList( arg, delim=";" ) + "}}" call = identifier + "(" + delimitedList(arg) + ")" term = call | identifier | num | Group( "(" + expr + ")" ) expr << (term + ZeroOrMore( operator+term ) ) typedef = Word( alphas, alphanums ) definition = ( (typedef + identifier) | identifier ) + "=" + arg arg << (expr | statement | identifier | num | str_ | "." | curve | spline | union | conditional | definition) assignment = identifier + "=" + statement statement << ( call | assignment ) line_ = statement + ';' declaration = OneOrMore(line_) print declaration.parseString(test) Prints: ['Cen2', '=', 'Cen', '(', 'OUT', '"Cep"', '"ies"', 'wh', '544', ['(', 'wh', '/', 'ht', ')'], ')', ';'] -- http://mail.python.org/mailman/listinfo/python-list