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)