Пример #1
0
def EvalCharLiteralForRegex(tok):
    """For regex char classes.

  Similar logic as below.
  """
    id_ = tok.id
    value = tok.val

    if id_ == Id.Char_OneChar:
        c = value[1]
        s = _ONE_CHAR[c]
        return class_literal_term.ByteSet(s, tok.span_id)

    elif id_ == Id.Char_Hex:
        s = value[2:]
        i = int(s, 16)
        return class_literal_term.ByteSet(chr(i), tok.span_id)

    elif id_ in (Id.Char_Unicode4, Id.Char_Unicode8):
        s = value[2:]
        i = int(s, 16)
        return class_literal_term.CodePoint(i, tok.span_id)

    else:
        raise AssertionError
Пример #2
0
def EvalCharLiteralForRegex(tok):
    # type: (Token) -> Optional[class_literal_term_t]
    """For regex char classes.

  Similar logic as below.
  """
    id_ = tok.id
    value = tok.val

    if id_ == Id.Char_OneChar:
        c = value[1]
        s = consts.LookupCharC(c)
        return class_literal_term.ByteSet(s, tok.span_id)

    elif id_ == Id.Char_Hex:
        s = value[2:]
        i = int(s, 16)
        return class_literal_term.ByteSet(chr(i), tok.span_id)

    elif id_ in (Id.Char_Unicode4, Id.Char_Unicode8):
        s = value[2:]
        i = int(s, 16)
        return class_literal_term.CodePoint(i, tok.span_id)

    elif id_ == Id.Expr_Name:  # [b B] is NOT mutated
        return None

    else:
        raise AssertionError(Id_str(id_))
Пример #3
0
  def _MutateClassLiteral(self, node):
    # type: (re_t) -> None
    for i, term in enumerate(node.terms):
      s = None
      if term.tag == class_literal_term_e.SingleQuoted:
        s = word_eval.EvalSingleQuoted(term)
        spid = term.left.span_id

      elif term.tag == class_literal_term_e.DoubleQuoted:
        s = self.word_ev.EvalDoubleQuotedToString(term)
        spid = term.left.span_id

      elif term.tag == class_literal_term_e.BracedVarSub:
        s = self.word_ev.EvalBracedVarSubToString(term)
        spid = term.spids[0]

      elif term.tag == class_literal_term_e.SimpleVarSub:
        s = self.word_ev.EvalSimpleVarSubToString(term.token)
        spid = term.token.span_id

      elif term.tag == class_literal_term_e.CharLiteral:
        # What about \0?
        # At runtime, ERE should disallow it.  But we can also disallow it here.
        node.terms[i] = word_compile.EvalCharLiteralForRegex(term.tok)

      if s is not None:
        # A string like '\x7f\xff' should be presented like
        if len(s) > 1:
          for c in s:
            if ord(c) > 128:
              e_die("Express these bytes as character literals to avoid "
                    "confusing them with encoded characters", span_id=spid)

        node.terms[i] = class_literal_term.ByteSet(s, spid)