Ejemplo n.º 1
0
    def __init__(self, formatter, raise_on_error=True, machine_name='root'):
        self.formatter = formatter
        self.raise_on_error = raise_on_error
        self.machine_name = machine_name

        self.line_offset = None
        self.i18n_language = None
        self.feature_uri = None

        self.listener = FormatterListener(self.formatter)
        self.machines = []
        self.push_machine(machine_name)
        self.lexer = I18nLexer(self)
Ejemplo n.º 2
0
class Parser(object):
    def __init__(self, formatter, raise_on_error=True, machine_name='root'):
        self.formatter = formatter
        self.raise_on_error = raise_on_error
        self.machine_name = machine_name

        self.line_offset = None
        self.i18n_language = None
        self.feature_uri = None

        self.listener = FormatterListener(self.formatter)
        self.machines = []
        self.push_machine(machine_name)
        self.lexer = I18nLexer(self)

    def parse(self, gherkin, feature_uri, line_offset):
        self.feature_uri = feature_uri
        self.formatter.uri(feature_uri)
        self.line_offset = line_offset
        self.lexer.scan(gherkin)

    def __getattr__(self, name):
        attr = getattr(self.listener, name)
        if type(attr) is not types.MethodType:
            raise AttributeError
        def wrapper(*args):
            if args[0] is self:
                args = args[1:]
            if name == u'eof':
                self.event(name, None)
            else:
                self.event(name, args[-1])
            attr(*args)
            if name == u'eof':
                self.pop_machine()
                self.push_machine(self.machine_name)

        setattr(self, name, wrapper)
        return wrapper.__get__(self, self.__class__)

    def event(self, event, line):
        if line:
            line = self.line_offset + line
        else:
            line = None

        self.machine.event(event, line)
        if not self.machine.error:
            return

        state = self.machine.state
        legal_events = self.machine.expected

        if self.raise_on_error:
            raise ParseError(state, event, legal_events, self.feature_uri, line)
        else:
            self.listener.syntax_error(state, event, legal_events,
                                       self.feature_uri, line)

    def push_machine(self, name):
        self.machines.append(Machine(self, name))

    def pop_machine(self):
        self.machines.pop()

    @property
    def machine(self):
        return self.machines[-1]

    @property
    def expected(self):
        return self.machine.expected

    def force_state(self, state):
        self.machine.state = state