Skip to content

Commit 9ca0c5d

Browse files
authored
Merge pull request #1467 from makukha/1466-add-tree-find-token
Add Tree.find_token() method
2 parents 2f7c9a4 + 971e418 commit 9ca0c5d

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
*.pyc
22
*.pyo
33
/.tox
4+
/lark.egg-info/**
45
/lark_parser.egg-info/**
56
tags
67
.vscode

lark/tree.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33

44
from typing import List, Callable, Iterator, Union, Optional, Generic, TypeVar, TYPE_CHECKING
55

6+
from .lexer import Token
7+
68
if TYPE_CHECKING:
7-
from .lexer import TerminalDef, Token
9+
from .lexer import TerminalDef
810
try:
911
import rich
1012
except ImportError:
@@ -171,6 +173,16 @@ def find_data(self, data: str) -> 'Iterator[Tree[_Leaf_T]]':
171173

172174
###}
173175

176+
def find_token(self, token_type: str) -> Iterator[_Leaf_T]:
177+
"""Returns all tokens whose type equals the given token_type.
178+
179+
This is a recursive function that will find tokens in all the subtrees.
180+
181+
Example:
182+
>>> term_tokens = tree.find_token('TERM')
183+
"""
184+
return self.scan_values(lambda v: isinstance(v, Token) and v.type == token_type)
185+
174186
def expand_kids_by_data(self, *data_values):
175187
"""Expand (inline) children with any of the given data values. Returns True if anything changed"""
176188
changed = False

tests/test_trees.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
class TestTrees(TestCase):
1818
def setUp(self):
1919
self.tree1 = Tree('a', [Tree(x, y) for x, y in zip('bcd', 'xyz')])
20+
self.tree2 = Tree('a', [
21+
Tree('b', [Token('T', 'x')]),
22+
Tree('c', [Token('T', 'y')]),
23+
Tree('d', [Tree('z', [Token('T', 'zz'), Tree('zzz', 'zzz')])]),
24+
])
2025

2126
def test_eq(self):
2227
assert self.tree1 == self.tree1
@@ -48,6 +53,11 @@ def test_iter_subtrees_topdown(self):
4853
nodes = list(self.tree1.iter_subtrees_topdown())
4954
self.assertEqual(nodes, expected)
5055

56+
def test_find_token(self):
57+
expected = [Token('T', 'x'), Token('T', 'y'), Token('T', 'zz')]
58+
tokens = list(self.tree2.find_token('T'))
59+
self.assertEqual(tokens, expected)
60+
5161
def test_visitor(self):
5262
class Visitor1(Visitor):
5363
def __init__(self):

0 commit comments

Comments
 (0)