Source code for il2fb.parsers.events.parsers

# -*- coding: utf-8 -*-

from pyparsing import ParseException

from .exceptions import EventParsingError
from .grammar.events import all_rules


__all__ = (
    'parse_string', 'parse_string_safely',
    'InclusiveEventsParser', 'ExclusiveEventsParser',
)


class EventsParser(object):

    def __init__(self, rules=None):
        self._rules = rules or all_rules

    def parse_string(self, string, ignore_errors=False):
        for rule in self._rules:
            try:
                return rule.parseString(string).event
            except ParseException:
                continue
            except (SystemExit, KeyboardInterrupt):
                raise
            except:
                if ignore_errors:
                    return
                else:
                    raise

        if not ignore_errors:
            raise EventParsingError("No grammar was found for string \"{0}\""
                                    .format(string))


__parser = EventsParser()


[docs]def parse_string(string): return __parser.parse_string(string)
[docs]def parse_string_safely(string): return __parser.parse_string(string, ignore_errors=True)
class SelectiveEventsParser(EventsParser): def __init__(self, rules, condition): rules = list(filter(condition, all_rules)) super(SelectiveEventsParser, self).__init__(rules) def parse_string(self, string): return (super(SelectiveEventsParser, self) .parse_string(string, ignore_errors=True))
[docs]class InclusiveEventsParser(SelectiveEventsParser): def __init__(self, includes): condition = lambda x: x.structure in includes super(InclusiveEventsParser, self).__init__(includes, condition)
[docs]class ExclusiveEventsParser(SelectiveEventsParser): def __init__(self, excludes): condition = lambda x: x.structure not in excludes super(ExclusiveEventsParser, self).__init__(excludes, condition)