我使用pyPEG来解析函数的声明。目前我写了这个:
from pypeg2 import attr, \
optional, \
csl, \
name, \
List, \
Namespace
class Parameters(Namespace):
grammar = optional(csl(name()))
class Function(List):
grammar = "def", name(), \
"(", attr("params", Parameters), "):"
例如,如果我这样做:
>>> import pypeg2
>>> f = pypeg2.parse("def f(a, b):", Function)
我希望f.params
包含a
和b
作为参数。代替:
>>> f.params
Parameters([], name=Symbol('b'))
仅找到b
。为什么b
是唯一找到的符号?
答案 0 :(得分:0)
因为name()
必不可少的是将匹配的Symbol
附加到班级的name
attr。在您的情况下,b
的附件会覆盖a
。
官方文件列出以下内容:
class Parameter(object):
grammar = attr("typing", Type), name()
class Parameters(Namespace):
grammar = csl(Parameter)
此处每个Parameter
都有一个name
。 Parameters
会查找匹配的name
的{{1}}属性,并将其放入内部Parameter
。