예제 #1
0
def _toAtomSequence(aSequence):
    
    prevMultifieldCount = 0
    returnSequence = []
    
    for fieldIndex, fieldContent in enumerate(aSequence):
        
        atomLocation = AtomLocation()
        isMultiField = _isMultifield(fieldContent) 
        
        if prevMultifieldCount and isMultiField:
            raise MyClipsException("Two multifields in a single expression found!")
            
        # calculate position from the end
        if prevMultifieldCount == 0:
            atomLocation.beginIndex = fieldIndex
            atomLocation.fromBegin = True
            
        if prevMultifieldCount > 0 or isMultiField :
            atomLocation.endIndex = len(aSequence) - fieldIndex - 1
            atomLocation.fromEnd = True
            
        if isMultiField:
            prevMultifieldCount += 1
            atomLocation.isMultiField = True
            
        returnSequence.append((atomLocation, fieldContent))
        
    return returnSequence
예제 #2
0
def _patternToAtomLocations(aPatternCE, patternIndex):
    
    if isinstance(aPatternCE, types.OrderedPatternCE):
        
        returnSequence = _toAtomSequence(aPatternCE.constraints)
        for atomLocation, _ in returnSequence:
            atomLocation.patternIndex = patternIndex
    
        return returnSequence
    
    elif isinstance(aPatternCE, types.TemplatePatternCE):
        
        returnSequence = []
        
        for slot in aPatternCE.templateSlots:
            
            if isinstance(slot, types.SingleFieldLhsSlot):
                # easy to handle: convert the location to a atom location with a field element
                atomLocation = AtomLocation()
                atomLocation.slotName = slot.slotName
                atomLocation.fullSlot = True
                atomLocation.patternIndex = patternIndex
            
                returnSequence.append((atomLocation, slot.slotValue))
                
            else:
                
                multifieldSequence = _toAtomSequence(slot.slotValue)
                for atomLocation, _ in multifieldSequence:
                    atomLocation.patternIndex = patternIndex
                    atomLocation.slotName = slot.slotName
                    
                returnSequence += multifieldSequence
                
        return returnSequence
        
    else:
        raise ValueError("Invalid aPatternCE types: %s"%aPatternCE.__class__.__name__)