Beispiel #1
0
    def expect(self, tokens, level=0, debug=False):
        index = tokens.getIndex()
        exhausted = tokens.isExhausted()
        error = "Value never instantiated!"
        value = Serializer(False, None, error)

        if debug:
            print('\t' * level + "RHSTree.expect(), Type:",
                  self.levelType.name, "; Level:", level)
            if self.levelKind == RHSKind.LEAF:
                print('\t' * level + "NODE:", str(self.node))
            print('\t' * level + "Before Index:", index)
            print('\t' * level + "Before Exhaust:", exhausted)
            print('\t' * level + "Current Token:", str(tokens.currentToken()))

        if self.levelType == RHSType.TERMINAL:
            if self.node.getValue() == '':
                yield Serializer(True, '', None)
            elif (not tokens.isExhausted()) and self.node.getValue(
            ) == tokens.currentToken().getValue():
                tokens.nextToken()
                yield Serializer(True, self.node.getValue(), None)
            else:
                error = "ERROR: Expected '" + str(
                    self.node.getValue()) + "', got: '" + str(
                        tokens.currentToken().getValue()) + "'"
        elif self.levelType == RHSType.REGEX:
            if (not tokens.isExhausted()) and self.node.isTypeOf(
                    tokens.currentToken().getValue()):
                thisToken = tokens.currentToken().getValue()
                tokens.nextToken()
                yield Serializer(True, thisToken, None)
            else:
                error = "ERROR: Expected token of type: '" + str(
                    self.node.getName()) + "', got: '" + str(
                        tokens.currentToken().getValue()) + "'"
        elif self.levelType == RHSType.IDENTIFIER:
            for value in self.link.expectMatch(tokens, level + 1, debug):
                if value:
                    yield value
                tokens.setIndex(index, exhausted)
            error = value.getError()
        elif self.levelType == RHSType.GROUP:
            for value in self.children[0].expect(tokens, level + 1, debug):
                if value:
                    yield value
                tokens.setIndex(index, exhausted)
            error = value.getError()
        elif self.levelType == RHSType.OPTIONAL:
            # First try not parsing this. If the execution gets back to this point,
            # then we need to actually use this option. Thus expect.
            yield Serializer(True, '', None)
            for value in self.children[0].expect(tokens, level + 1, debug):
                if value:
                    yield value
                tokens.setIndex(index, exhausted)
            error = value.getError()
        elif self.levelType == RHSType.REPEAT:
            for value in self.expectRepeat(tokens, level, debug):
                if value:
                    yield value
            tokens.setIndex(
                index,
                exhausted)  # this isn't in the loop because if repeat fails
            # we typically want to try more tokens, not less
            error = value.getError()
        elif self.levelType == RHSType.CONCATENATION:
            for value in self.expectConcat(tokens, 0, level + 1, debug):
                if value:
                    yield value
                tokens.setIndex(index, exhausted)
            error = value.getError()
        elif self.levelType == RHSType.ALTERNATION:
            for child in self.children:
                for value in child.expect(tokens, level + 1, debug):
                    if value:
                        yield value
                    tokens.setIndex(index, exhausted)
            error = value.getError()

        if debug:
            print('\t' * level + "After  Index:", tokens.getIndex())
            print('\t' * level + "result:", False)
            print('\t' * level + "Is Exhausted:", tokens.isExhausted())
            print('\t' * level + 'Error:', str(error))
            print('\t' * level + "value:", str(value), "\n")

        yield Serializer(False, None, error)