Fix IndexErrortags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.1
@@ -459,15 +459,20 @@ class PackedData(): | |||||
that comes from the left child and the right child. | that comes from the left child and the right child. | ||||
""" | """ | ||||
class _NoData(): | |||||
pass | |||||
NO_DATA = _NoData() | |||||
def __init__(self, node, data): | def __init__(self, node, data): | ||||
self.left = None | |||||
self.right = None | |||||
self.left = self.NO_DATA | |||||
self.right = self.NO_DATA | |||||
if data: | if data: | ||||
if node.left: | |||||
if node.left is not None: | |||||
self.left = data[0] | self.left = data[0] | ||||
if len(data) > 1 and node.right: | |||||
if len(data) > 1: | |||||
self.right = data[1] | self.right = data[1] | ||||
elif node.right: | |||||
else: | |||||
self.right = data[0] | self.right = data[0] | ||||
class ForestToParseTree(ForestTransformer): | class ForestToParseTree(ForestTransformer): | ||||
@@ -558,12 +563,12 @@ class ForestToParseTree(ForestTransformer): | |||||
children = [] | children = [] | ||||
assert len(data) <= 2 | assert len(data) <= 2 | ||||
data = PackedData(node, data) | data = PackedData(node, data) | ||||
if data.left is not None: | |||||
if data.left is not PackedData.NO_DATA: | |||||
if node.left.is_intermediate and isinstance(data.left, list): | if node.left.is_intermediate and isinstance(data.left, list): | ||||
children += data.left | children += data.left | ||||
else: | else: | ||||
children.append(data.left) | children.append(data.left) | ||||
if data.right is not None: | |||||
if data.right is not PackedData.NO_DATA: | |||||
children.append(data.right) | children.append(data.right) | ||||
if node.parent.is_intermediate: | if node.parent.is_intermediate: | ||||
return children | return children | ||||
@@ -37,6 +37,7 @@ from lark.tree import Tree | |||||
from lark.visitors import Transformer, Transformer_InPlace, v_args | from lark.visitors import Transformer, Transformer_InPlace, v_args | ||||
from lark.grammar import Rule | from lark.grammar import Rule | ||||
from lark.lexer import TerminalDef, Lexer, TraditionalLexer | from lark.lexer import TerminalDef, Lexer, TraditionalLexer | ||||
from lark.indenter import Indenter | |||||
logger.setLevel(logging.INFO) | logger.setLevel(logging.INFO) | ||||
@@ -1894,6 +1895,28 @@ def _make_parser_test(LEXER, PARSER): | |||||
tree = parser.parse(test_file) | tree = parser.parse(test_file) | ||||
self.assertEqual(tree.children, [Token('B', 'A')]) | self.assertEqual(tree.children, [Token('B', 'A')]) | ||||
@unittest.skipIf(LEXER=='dynamic', "%declare/postlex doesn't work with dynamic") | |||||
def test_postlex_indenter(self): | |||||
class CustomIndenter(Indenter): | |||||
NL_type = 'NEWLINE' | |||||
OPEN_PAREN_types = [] | |||||
CLOSE_PAREN_types = [] | |||||
INDENT_type = 'INDENT' | |||||
DEDENT_type = 'DEDENT' | |||||
tab_len = 8 | |||||
grammar = r""" | |||||
start: "a" NEWLINE INDENT "b" NEWLINE DEDENT | |||||
NEWLINE: ( /\r?\n */ )+ | |||||
%ignore " "+ | |||||
%declare INDENT DEDENT | |||||
""" | |||||
parser = _Lark(grammar, postlex=CustomIndenter()) | |||||
parser.parse("a\n b\n") | |||||
def test_import_custom_sources(self): | def test_import_custom_sources(self): | ||||
custom_loader = FromPackageLoader('tests', ('grammars', )) | custom_loader = FromPackageLoader('tests', ('grammars', )) | ||||