瀏覽代碼

Merge pull request #755 from chanicpanic/fix-index-error

Fix IndexError
tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.1
Erez Shinan 3 年之前
committed by GitHub
父節點
當前提交
1a3df7909f
沒有發現已知的金鑰在資料庫的簽署中 GPG 金鑰 ID: 4AEE18F83AFDEB23
共有 2 個檔案被更改,包括 35 行新增7 行删除
  1. +12
    -7
      lark/parsers/earley_forest.py
  2. +23
    -0
      tests/test_parser.py

+ 12
- 7
lark/parsers/earley_forest.py 查看文件

@@ -459,15 +459,20 @@ class PackedData():
that comes from the left child and the right child.
"""

class _NoData():
pass

NO_DATA = _NoData()

def __init__(self, node, data):
self.left = None
self.right = None
self.left = self.NO_DATA
self.right = self.NO_DATA
if data:
if node.left:
if node.left is not None:
self.left = data[0]
if len(data) > 1 and node.right:
if len(data) > 1:
self.right = data[1]
elif node.right:
else:
self.right = data[0]

class ForestToParseTree(ForestTransformer):
@@ -558,12 +563,12 @@ class ForestToParseTree(ForestTransformer):
children = []
assert len(data) <= 2
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):
children += data.left
else:
children.append(data.left)
if data.right is not None:
if data.right is not PackedData.NO_DATA:
children.append(data.right)
if node.parent.is_intermediate:
return children


+ 23
- 0
tests/test_parser.py 查看文件

@@ -37,6 +37,7 @@ from lark.tree import Tree
from lark.visitors import Transformer, Transformer_InPlace, v_args
from lark.grammar import Rule
from lark.lexer import TerminalDef, Lexer, TraditionalLexer
from lark.indenter import Indenter

logger.setLevel(logging.INFO)

@@ -1894,6 +1895,28 @@ def _make_parser_test(LEXER, PARSER):
tree = parser.parse(test_file)
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):
custom_loader = FromPackageLoader('tests', ('grammars', ))



Loading…
取消
儲存