Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Adding a setResultsName() breaks grammar? #95

Closed
@mcondarelli

Description

@mcondarelli

I'm still experimenting with grammars and I'm quite baffled.

The following example is lifted from examples/fourFn.py almost verbatim.
I deleted the "exwcuting" parseActions and (hopefully just cosmetically) changed grammar to better understand some constructs.

Nest step should be:

  • tag specific nodes with names
  • slightly restructure grammar to "unflatten" repeated operators

Even the very first change (adding a single ResultsName) breaks the grammar and I'm unable to understand what I did so wrong :(

import math

from pyparsing import *


# ORIGINAL GRAMMAR
e     = CaselessKeyword( "E" )('constant')
pi    = CaselessKeyword( "PI" )('constant')
fnumber = Regex(r"[+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?")('fliteral')
ident = Word(alphas, alphanums+"_$")('ident')

plus = Literal("+")
minus = Literal("-")
mult = Literal("*")
div = Literal("/")
lpar = Suppress("(")
rpar = Suppress(")")
addop = plus | minus
multop = mult | div
expop = Literal("^")

expr = Forward()('operation')
atom = (ZeroOrMore(minus('uminus')) + ( pi | e | fnumber | ident + lpar + expr + rpar | ident | lpar + expr + rpar ))
factor = Forward()
factor << atom + ZeroOrMore(expop + factor)
term = factor + ZeroOrMore(multop + factor)
expr << term + ZeroOrMore(addop + term)

bnf0 = expr

# MODIFIED GRAMMAR
e     = CaselessKeyword( "E" )('constant')
pi    = CaselessKeyword( "PI" )('constant')
fnumber = Regex(r"[+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?")('fliteral')
ident = Word(alphas, alphanums+"_$")('ident')

plus = Literal("+")
minus = Literal("-")
mult = Literal("*")
div = Literal("/")
lpar = Suppress("(")
rpar = Suppress(")")
addop = plus | minus
multop = mult | div
expop = Literal("^")

expr = Forward()('operation')              # This is the only difference -----vvvvvvv... for now!
atom = (ZeroOrMore(minus('uminus')) + ( pi | e | fnumber | ident + lpar + expr('arg') + rpar | ident | lpar + expr + rpar ))
factor = Forward()
factor << atom + ZeroOrMore(expop + factor)
term = factor + ZeroOrMore(multop + factor)
expr << term + ZeroOrMore(addop + term)

bnf1 = expr


def test( s, expVal ):
    print('==================')
    print(s)
    try:
        results = bnf0.parseString( s, parseAll=True )
    except ParseException as pe:
        print(s, "failed parse:", str(pe))
    except Exception as e:
        print(s, "failed eval:", str(e))
    else:
        print('------------------')
        print(results.dump())
    try:
        results = bnf1.parseString(s, parseAll=True)
    except ParseException as pe:
        print(s, "failed parse:", str(pe))
    except Exception as e:
        print(s, "failed eval:", str(e))
    else:
        print('------------------')
        print(results.dump())
    print('==================')


test( "round(PI^2)", round(math.pi**2) )

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions