PEG 节点访问者
PEG NodeVisitor
想象一个像
这样的小PEG
语法
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
term = lpar (number comma? ws?)+ rpar
number = ~"\d+"
lpar = "("
rpar = ")"
comma = ","
ws = ~"\s*"
"""
)
tree = grammar.parse("(5, 4, 3)")
print(tree)
输出
<Node called "term" matching "(5, 4, 3)">
<Node called "lpar" matching "(">
<Node matching "5, 4, 3">
<Node matching "5, ">
<RegexNode called "number" matching "5">
<Node matching ",">
<Node called "comma" matching ",">
<Node matching " ">
<RegexNode called "ws" matching " ">
<Node matching "4, ">
<RegexNode called "number" matching "4">
<Node matching ",">
<Node called "comma" matching ",">
<Node matching " ">
<RegexNode called "ws" matching " ">
<Node matching "3">
<RegexNode called "number" matching "3">
<Node matching "">
<Node matching "">
<RegexNode called "ws" matching "">
<Node called "rpar" matching ")">
如何从本例中的 term
中获取 number
正则表达式部分?我知道我可以使用 NodeVisitor class 并检查每个数字,但我想从 term
.
中获取正则表达式部分
使用 NodeVisitor
class 并以这种方式遍历树可能更好,但这是另一个简单的解决方案:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
term = lpar (number comma? ws?)+ rpar
number = ~"\d+"
lpar = "("
rpar = ")"
comma = ","
ws = ~"\s*"
"""
)
tree = grammar.parse("(5, 4, 3)")
def walk(node):
if node.expr_name == 'number':
print(node)
for child in node.children:
walk(child)
walk(tree)
# <RegexNode called "number" matching "5">
# <RegexNode called "number" matching "4">
# <RegexNode called "number" matching "3">
想象一个像
这样的小PEG
语法
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
term = lpar (number comma? ws?)+ rpar
number = ~"\d+"
lpar = "("
rpar = ")"
comma = ","
ws = ~"\s*"
"""
)
tree = grammar.parse("(5, 4, 3)")
print(tree)
输出
<Node called "term" matching "(5, 4, 3)">
<Node called "lpar" matching "(">
<Node matching "5, 4, 3">
<Node matching "5, ">
<RegexNode called "number" matching "5">
<Node matching ",">
<Node called "comma" matching ",">
<Node matching " ">
<RegexNode called "ws" matching " ">
<Node matching "4, ">
<RegexNode called "number" matching "4">
<Node matching ",">
<Node called "comma" matching ",">
<Node matching " ">
<RegexNode called "ws" matching " ">
<Node matching "3">
<RegexNode called "number" matching "3">
<Node matching "">
<Node matching "">
<RegexNode called "ws" matching "">
<Node called "rpar" matching ")">
如何从本例中的 term
中获取 number
正则表达式部分?我知道我可以使用 NodeVisitor class 并检查每个数字,但我想从 term
.
使用 NodeVisitor
class 并以这种方式遍历树可能更好,但这是另一个简单的解决方案:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
term = lpar (number comma? ws?)+ rpar
number = ~"\d+"
lpar = "("
rpar = ")"
comma = ","
ws = ~"\s*"
"""
)
tree = grammar.parse("(5, 4, 3)")
def walk(node):
if node.expr_name == 'number':
print(node)
for child in node.children:
walk(child)
walk(tree)
# <RegexNode called "number" matching "5">
# <RegexNode called "number" matching "4">
# <RegexNode called "number" matching "3">