我试图从pyparsing中了解Forward()
元素。假设我有这个简单的BNF:用pyparsing编写递归解析器
identifier =
"a..z,$,_" < "a..z,$,_,0..9" >
package_name =
identifier
/(package_name "." identifier)
,我尝试解析一个简单的包像java.lang.String
我得到要么只是java
作为结果或从不递归返回。 我试着这样说:
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")
将打印[ '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")
将达到递归限制
请问这是怎么Forward
占位符的工作?
为什么不只是'package_name = ZeroOrMore(identifier + dot)+ identifier'?我认为你正在做的事情的问题是它的复发*和*涉及ZeroOrMore,它允许它保持匹配零。您的原始BNF没有相当于ZeroOrMore。但是完全避免递归更简单。 – BrenBarn
我知道我可以做到另一种方式。像'delimitedList(标识符,delim =“。”)'但我想了解'前向'递归ParserElement。即使'package_name << definition'也不行 –