Closed
Description
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
Labels
No labels