Sto cercando di capire l'elemento Forward()
da pyparsing. Supponiamo che io sono questo semplice BNF:Scrittura parser ricorsivo con pyparsing
identifier =
"a..z,$,_" < "a..z,$,_,0..9" >
package_name =
identifier
/(package_name "." identifier)
e cerco di analizzare un semplice pacchetto come java.lang.String
ricevo o solo java
come risultato o non tornare da ricorsione. ho provato in questo modo:
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")
stamperà [[ '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")
raggiungerà limite di ricorsione
come funziona Forward
segnaposto?
Perché non si fa semplicemente 'package_name = ZeroOrMore (identificatore + punto) + identificatore'? Penso che il problema con quello che stai facendo è che è ricorsivo * e * coinvolge ZeroOrMore, che gli consente di mantenere lo zero corrispondente. Il tuo BNF originale non ha equivalenti a ZeroOrMore. Ma è più semplice evitare la ricorsione del tutto. – BrenBarn
so che potrei farlo in un altro modo. come 'delimitedList (identifier, delim =". ")' ma voglio capire la ricorsione di ParserElement di 'Forward'. Anche 'package_name << definition' non funzionerà –