Example #1
0
def p_pattern_sequence(t):
    """
    pattern : LPAREN pattern-sequence RPAREN
            | LPAREN RPAREN 
    """
    if len(t) == 3:
        t[0] = pat.PatSequence([])
    else:
        t[0] = pat.PatSequence(t[2])
Example #2
0
 def transformPatSequence(self, node):
     assert isinstance(node, pattern.PatSequence)
     variables = {}
     seq = []
     for pat in node.seq:
         npat, npatvariables = self.transform(pat)
         seq.append(npat)
         variables = self._merge_variable_maps(variables, npatvariables)
     return pattern.PatSequence(seq).copyattributesfrom(node), variables
Example #3
0
def p_tl_pat(t):
    """
    tl-pat : IDENT
           | LPAREN tl-pat-ele RPAREN
    """
    if len(t) == 2:
        t[0] = pat.Nt(t[1], t[1])
    else:
        t[0] = pat.PatSequence(t[2])
Example #4
0
 def transformPatSequence(self, node):
     assert isinstance(node, pattern.PatSequence)
     if len(node.seq) == 0:
         return node, {}
     nseq = []
     npat, syms = self.transform(node.seq[0])
     nseq.append(npat)
     for pat in node.seq[1:]:
         npat, nsyms = self.transform(pat)
         nseq.append(npat)
         syms, syms2check = self._merge_variable_maps(syms, nsyms)
         for sym1, sym2 in syms2check:
             nseq.append(pattern.CheckConstraint(sym1, sym2))
     return pattern.PatSequence(nseq).copyattributesfrom(node), syms
Example #5
0
    def transformPatSequence(self, sequence):
        assert isinstance(sequence, pattern.PatSequence)
        closures = self.closures

        # recursively transform patterns first.
        tseq = []
        for pat in sequence.seq:
            tseq.append(self.transform(pat))

        nseq = []
        partitions = self._partitionseq(tseq)
        for contains_ellipsis, partition in partitions:
            if contains_ellipsis:
                for i in range(len(partition) - 1):
                    pat1, pat2 = partition[i], partition[i + 1]
                    if isinstance(pat1, pattern.Repeat):
                        psc = self.PatternStructuralChecker(closures)
                        if isinstance(pat2, pattern.Repeat):
                            p1, p2 = pat1.pat, pat2.pat
                        else:
                            p1, p2 = pat1.pat, pat2
                        if psc.aredifferent(p1, p2):
                            nrep = pattern.Repeat(
                                p1, pattern.RepeatMatchMode.Deterministic
                            ).copymetadatafrom(pat1)
                            nseq.append(nrep)
                        else:
                            nseq.append(pat1)
                # append the last unprocessed element
                last = partition[-1]
                if isinstance(last, pattern.Repeat):
                    if not isinstance(last.pat, pattern.InHole):
                        last = pattern.Repeat(
                            last.pat, pattern.RepeatMatchMode.Deterministic
                        ).copymetadatafrom(last)
                nseq.append(last)
            else:
                nseq += partition
        return pattern.PatSequence(nseq).copymetadatafrom(sequence)
Example #6
0
 def __init__(self, name, domain, codomain):
     self.name = name
     self.domain = pattern.PatSequence(
         [pattern.Lit(name, pattern.LitKind.Variable)] +
         domain)  # we will turn contract into pattern.
     self.codomain = codomain
Example #7
0
 def __init__(self, name, patternsequence, termtemplate):
     self.name = name
     self.patternsequence = pattern.PatSequence(
         [pattern.Lit(name, pattern.LitKind.Variable)] +
         patternsequence)
     self.termtemplate = termtemplate