Browse Source

CYK also working

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.7.2
Erez Shinan 5 years ago
parent
commit
bcc4e67bce
2 changed files with 9 additions and 7 deletions
  1. +2
    -2
      lark/parser_frontends.py
  2. +7
    -5
      lark/parsers/cyk.py

+ 2
- 2
lark/parser_frontends.py View File

@@ -194,13 +194,13 @@ class CYK(WithLexer):
self.init_traditional_lexer() self.init_traditional_lexer()


self._analysis = GrammarAnalyzer(parser_conf) self._analysis = GrammarAnalyzer(parser_conf)
self._parser = cyk.Parser(parser_conf.rules, parser_conf.start)
self.parser = cyk.Parser(parser_conf.rules)


self.callbacks = parser_conf.callbacks self.callbacks = parser_conf.callbacks


def parse(self, text, start): def parse(self, text, start):
tokens = list(self.lex(text)) tokens = list(self.lex(text))
parse = self._parser.parse(tokens)
parse = self._parse(tokens, start)
parse = self._transform(parse) parse = self._transform(parse)
return parse return parse




+ 7
- 5
lark/parsers/cyk.py View File

@@ -84,12 +84,11 @@ class RuleNode(object):
class Parser(object): class Parser(object):
"""Parser wrapper.""" """Parser wrapper."""


def __init__(self, rules, start):
def __init__(self, rules):
super(Parser, self).__init__() super(Parser, self).__init__()
self.orig_rules = {rule: rule for rule in rules} self.orig_rules = {rule: rule for rule in rules}
rules = [self._to_rule(rule) for rule in rules] rules = [self._to_rule(rule) for rule in rules]
self.grammar = to_cnf(Grammar(rules)) self.grammar = to_cnf(Grammar(rules))
self.start = NT(start[0])


def _to_rule(self, lark_rule): def _to_rule(self, lark_rule):
"""Converts a lark rule, (lhs, rhs, callback, options), to a Rule.""" """Converts a lark rule, (lhs, rhs, callback, options), to a Rule."""
@@ -100,13 +99,16 @@ class Parser(object):
weight=lark_rule.options.priority if lark_rule.options and lark_rule.options.priority else 0, weight=lark_rule.options.priority if lark_rule.options and lark_rule.options.priority else 0,
alias=lark_rule) alias=lark_rule)


def parse(self, tokenized): # pylint: disable=invalid-name
def parse(self, tokenized, start): # pylint: disable=invalid-name
"""Parses input, which is a list of tokens.""" """Parses input, which is a list of tokens."""
assert start
start = NT(start)

table, trees = _parse(tokenized, self.grammar) table, trees = _parse(tokenized, self.grammar)
# Check if the parse succeeded. # Check if the parse succeeded.
if all(r.lhs != self.start for r in table[(0, len(tokenized) - 1)]):
if all(r.lhs != start for r in table[(0, len(tokenized) - 1)]):
raise ParseError('Parsing failed.') raise ParseError('Parsing failed.')
parse = trees[(0, len(tokenized) - 1)][self.start]
parse = trees[(0, len(tokenized) - 1)][start]
return self._to_tree(revert_cnf(parse)) return self._to_tree(revert_cnf(parse))


def _to_tree(self, rule_node): def _to_tree(self, rule_node):


Loading…
Cancel
Save