Ich versuche das Forward()
Element aus Pyparsen zu verstehen. Angenommen, ich habe diese einfache BNF:schreibe rekursiven Parser mit pyparsing
identifier =
"a..z,$,_" < "a..z,$,_,0..9" >
package_name =
identifier
/(package_name "." identifier)
und ich versuche, ein einfaches Paket zu analysieren, wie java.lang.String
ich entweder nur java
als Ergebnis erhalten oder nie von Rekursion zurück. Ich habe versucht, es wie folgt aus:
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")
druckt [[ '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")
wird Rekursion Grenze
wie funktioniert dieses Forward
Platzhalter Arbeit erreichen?
Warum machst du nicht 'package_name = ZeroOrMore (identifier + dot) + identifier'? Ich denke, das Problem mit dem, was Sie tun, ist, dass es recurise * und * beinhaltet ZeroOrMore, die es ermöglicht, auf Null zu halten. Dein originales BNF hat kein Äquivalent von ZeroOrMore. Aber es ist einfacher, die Rekursion ganz zu vermeiden. – BrenBarn
Ich weiß, ich könnte es anders machen. wie 'delimitedList (identifier, delim =". ")', aber ich möchte das 'Forward'-Recursion-ParserElement verstehen. Selbst 'package_name << definition' wird nicht funktionieren –