parameters: (expr)
return_statement: return rep
docstring: Helper to define an expression that is indirectly defined from
  
      the tokens matched in a previous expression, that is, it looks
  
      for a 'repeat' of a previous expression.  For example::
  
          first = Word(nums)
  
          second = matchPreviousLiteral(first)
  
          matchExpr = first + ":" + second
  
      will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
  
      previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
  
      If this is not desired, use C{matchPreviousExpr}.
  
      Do I{not} use with packrat parsing enabled.
function: def matchPreviousLiteral(expr):
  
      """
  
      Helper to define an expression that is indirectly defined from
  
      the tokens matched in a previous expression, that is, it looks
  
      for a 'repeat' of a previous expression.  For example::
  
          first = Word(nums)
  
          second = matchPreviousLiteral(first)
  
          matchExpr = first + ":" + second
  
      will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
  
      previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
  
      If this is not desired, use C{matchPreviousExpr}.
  
      Do I{not} use with packrat parsing enabled.
  
      """
  
      rep = Forward()
  
      def copyTokenToRepeater(s,l,t):
  
          if t:
  
              if len(t) == 1:
  
                  rep << t[0]
  
              else:
  
                  # flatten t tokens
  
                  tflat = _flatten(t.asList())
  
                  rep << And(Literal(tt) for tt in tflat)
  
          else:
  
              rep << Empty()
  
      expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
  
      rep.setName('(prev) ' + _ustr(expr))
  
      return rep
function_tokens: def matchPreviousLiteral ( expr ) : rep = Forward ( ) def copyTokenToRepeater ( s , l , t ) : if t : if len ( t ) == 1 : rep << t [ 0 ] else : # flatten t tokens tflat = _flatten ( t . asList ( ) ) rep << And ( Literal ( tt ) for tt in tflat ) else : rep << Empty ( ) expr . addParseAction ( copyTokenToRepeater , callDuringTry = True ) rep . setName ( '(prev) ' + _ustr ( expr ) ) return rep