I'm trying to understand the Forward() element from pyparsing. Suppose I have this simple BNF:
identifier =
"a..z,$,_" < "a..z,$,_,0..9" >
package_name =
identifier
/ ( package_name "." identifier )
and I try to parse a simple package like java.lang.String I get either just java as result or never return from recursion.
I tried it like this:
from pyparsing import alphas,alphanums, Word, Forward, ZeroOrMore, Group, Literal
identifier=Word(alphas+"$_",alphanums+"$_")
dot=Literal(".")
package_name = Forward()
definition = package_name+dot+identifier
package_name << Group(identifier+ZeroOrMore(definition))
package_name.parseString("java.lang.String")
will print [['java']]
from pyparsing import alphas,alphanums, Word, Forward, ZeroOrMore, Group, Literal
identifier=Word(alphas+"$_",alphanums+"$_")
dot=Literal(".")
package_name = Forward()
definition = identifier^package_name+dot+identifier
package_name << definition
package_name.parseString("java.lang.String")
will reach recursion limit
how does this Forward placeholder work?
package_name = ZeroOrMore(identifier+dot) + identifier? I think the problem with what you're doing is that it's recurise and involves ZeroOrMore, which allows it to keep on matching zero. Your original BNF has no equivalent of ZeroOrMore. But it's simpler to avoid recursion altogether.delimitedList(identifier,delim=".")but I want to understand theForwardrecursion ParserElement. Evenpackage_name << definitionwon't work