re: character classes are parsed as regular expressions
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 76/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- javascript, python
- Área
- compilers
Línea de trabajo
Start in transcrypt/modules/re/translate.py, reading shift() and countCaptureGroups() to understand how the tokenizer handles character classes. Compare the listed CPython and Transcrypt examples, including classes containing parentheses and a leading literal ]. Done means capture-group numbering matches CPython and the []x], and invalid [] cases behave as described.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
re: character classes are parsed as regular expressions
transcrypt/modules/re/translate.py turns a Python regex into a token list. The tokenizer has no notion of character classes. Every character inside [...] becomes a token of its own. That causes two defects.
Parentheses inside a character class are counted as capture groups
countCaptureGroups() counts every token named (. A ( inside a character class is counted too. All groups behind such a class shift by one.
import re
r = re.compile(r"(?P<a>[()])(?P<b>x)")
| CPython | Transcrypt | |
|---|---|---|
r.groups |
2 | 3 |
r.groupindex |
{'a': 1, 'b': 2} |
{'a': 1, 'b': 3} |
r.match("(x").group("b") returns x under CPython and None under Transcrypt. The generated JavaScript is correct, only the group numbers are wrong.
A literal ] at the start of a character class is not translated
Python treats a ] right behind [ or [^ as a literal. JavaScript ends the class at it. The translator passes the class through unchanged.
re.compile(r"[]x]") matches ] and x under CPython. Transcrypt emits []x] and the RegExp constructor raises Invalid regular expression: /[]x]/u: Lone quantifier brackets. Without the u flag the pattern compiles but means an empty class followed by x], so it never matches.
The reverse case is silent. re.compile("[]") raises unterminated character set under CPython. Transcrypt accepts it and returns a pattern that never matches.
Fix
Both defects go away when shift() consumes a character class as a single token. The class content is then never parsed as a regular expression, and the literal ] can be escaped while the class is read.
- Lenguaje dominante
- Python
- Estrellas
- 2.9k
- Forks
- 218
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de TranscryptOrg/Transcrypt
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
TranscryptOrg/Transcrypt#913 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
TranscryptOrg/Transcrypt#911 · 2 comentarios ·
-
IS: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
TranscryptOrg/Transcrypt#908 ·
-
SUB: documentation
Dificultad 1/5 Menos de una hora Aptitud para principiantes 62/100
TranscryptOrg/Transcrypt#656 · 7 comentarios ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
TranscryptOrg/Transcrypt#910 ·
Todos los issues de TranscryptOrg/Transcrypt
Issues similares
-
New InternshipAbiertonew_internship
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
-
[BUG] Reports tab: "Unban" button tooltip shows raw `{{ip}}` placeholder instead of the IP addressAbiertobug javascript ui
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
bunkerity/bunkerweb#4001 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
PedestrianDynamics/pyFDS-Evac#476 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
google/differential-privacy#516 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
adobe-fonts/source-serif#153 ·