Referencia de creación de ExpandaEVE

ExpandaEVE es la forma legible del lenguaje EVE. Es lo que escribes en un archivo de filtro .eve. Cada construcción de aquí se traduce a CompactaEVE y luego se compila. Esta página documenta cada construcción con ejemplos reales extraídos de los archivos de filtro que vienen de fábrica.

Para las directivas de nivel de documento (DEFINE, LET, REALM, las instrucciones de regla) consulta El lenguaje EVE. Esta página trata sobre el cuerpo de una regla difusa: el patrón en sí.

La forma del cuerpo de una regla

El cuerpo de una regla difusa siempre tiene una raíz y puede añadir cualquier número de construcciones a su alrededor. La raíz es la palabra tallo sobre la que se construye la regla. Todo lo demás la refina: sufijos, gestión de plurales, exclusiones, contexto, y así sucesivamente.

HEAR rule
AS
  fuck(WHOLE)
  suffix(NONE OR er OR ers OR ing OR ed OR s)
  FLAG(pf YES)

Aquí fuck(WHOLE) es la raíz, suffix(...) añade las terminaciones permitidas y FLAG(pf YES) etiqueta la categoría. Las construcciones pueden aparecer en cualquier orden que se lea de forma natural; el traductor reconoce cada una por palabra clave.

La raíz y sus marcadores de límite

La raíz es el ancla de una regla. Exactamente un marcador de raíz establece con qué rigor se delimita la coincidencia en la raíz:

Marcador Significado
(WHOLE) La raíz debe coincidir como palabra completa. El candidato comienza con el tallo raíz y toda la ruta se extiende hasta un límite de palabra. Se escribe [^^] en CompactaEVE.
(ROOT) La raíz es un tallo sobre el que se construyen los sufijos y grupos. No necesita ser una palabra completa por sí misma. Se escribe [*^] en CompactaEVE.

Usa (WHOLE) cuando la palabra desnuda es en sí misma la infracción:

  spic(WHOLE)
  PLURAL

Usa (ROOT) cuando vayas a adjuntar terminaciones o grupos finales:

  ni(ROOT)
  suffix(g OR ga OR gga OR gger OR gl LETTER t)
  PLURAL

Cada regla difusa necesita un marcador de raíz

Un cuerpo de regla sin un marcador (WHOLE) o (ROOT) no puede compilar. El marcador es lo que separa el tallo raíz del resto del patrón.

La coincidencia difusa es automática

Una raíz difusa no es una prueba de cadena literal. El matcher ya tolera la evasión común: las vocales son intercambiables a través del conjunto de vocales, las letras pueden estirarse y los huecos (consulta GAP) dejan pasar caracteres insertados donde los permitas. No lo activas; así es como coinciden las reglas difusas. Para capturar un abanico más amplio de faltas de ortografía deliberadas, añade alias y skeletons.

suffix: terminaciones permitidas

suffix(...) enumera las terminaciones que la palabra puede tomar después de la raíz. Los brazos se separan con OR. Solo se necesita un grupo de sufijo, pero puedes apilar varios; cada uno añade un segmento opcional en orden.

  bitch(WHOLE)
  suffix(NONE OR es OR ed OR ing OR y OR ier OR iest OR fest OR fests)

NONE significa que la terminación es opcional: la palabra puede terminar justo en la raíz. Sin un brazo NONE el sufijo es obligatorio.

Los grupos de sufijo se componen de izquierda a derecha, así que varios seguidos construyen una cadena de segmentos opcionales:

  fa(ROOT)
  suffix(g OR gg OR NONE)
  suffix(ggot OR NONE)
  suffix(ggie OR NONE)

Un brazo de sufijo puede contener él mismo GAP o LETTER (consulta GAP y LETTER):

  suffix(g OR ga OR gga OR gger OR gl LETTER t)
  suffix(my GAP OR NONE)

PLURAL

PLURAL añade un rico conjunto de terminaciones de plural e inflexión en una palabra. Se expande a la clase integrada s de terminaciones, así que una regla etiquetada con PLURAL también captura -s, -z, -es, -ing, -ed, -er, -y y los demás miembros declarados en la función s.

  dyke(WHOLE)
  PLURAL

PLURAL lee la clase llamada s. El filtro inglés que viene de fábrica la declara como:

LET function(s) BE s OR z OR es OR ez OR ies OR iez OR y>ies OR y>iez OR ing OR ings OR ed OR er OR ers OR y OR ys

Un brazo escrito from>to es una terminación de reescritura: coincide con una palabra que termina en to probando la raíz con la terminación from en su lugar. y>ies captura una palabra que termina en ies como si terminara en y, que es como baby y babies se alcanzan ambos desde una raíz. Consulta Sufijos de reescritura para conocer los mecanismos.

NEVER: exclusiones

NEVER(...) enumera frases que no deben aparecer en la línea circundante. Si alguna frase listada está presente, la regla no se dispara, aunque el patrón coincida por lo demás. Así es como se evita que una raíz agresiva capture palabras inocentes.

  wop(WHOLE)
  PLURAL
  NEVER(doowop OR doo wop OR doowap OR doo wap OR dowap OR do wap OR do wop)
  gook(WHOLE)
  PLURAL
  NEVER(600k OR 900k OR 60ok OR 90ok OR 6ook OR 9ook OR 600ks OR 900ks)

Una comprobación NEVER es una prueba de subcadena simple contra toda la línea, en minúsculas. Si la frase está en cualquier lugar del mensaje, la regla se veta.

ALIAS: grafías alternativas

ALIAS(...) añade una grafía alternativa de la raíz. Cada alias es una variante de raíz separada que reutiliza el resto de la regla (sus sufijos, grupos, exclusiones). Enumera un alias por línea para cubrir faltas de ortografía deliberadas e intercambios de letras.

  ALIAS(phuck)
  ALIAS(fuk)
  ALIAS(fukk)
  ALIAS(fucc)
  ALIAS(fck)
  ALIAS(fk)
  fuck(WHOLE)
  suffix(NONE OR er OR ers OR ing OR ed OR s)

Cada alias aquí coincide con el mismo conjunto de sufijos que fuck. Un alias puede llevar su propio marcador (WHOLE) o (ROOT); sin uno, hereda el límite de la raíz.

Un alias puede referenciar una función, en cuyo caso cada miembro de esa función se convierte en un alias:

  ALIAS(function(selfharmverb))
  kill(ROOT)

Un alias también puede ser una palabra segmentada o un fragmento de varias partes; se normaliza de la misma forma que la raíz.

ALSO: fragmentos aditivos

ALSO(...) añade un fragmento que puede aparecer en cualquier lugar después de la raíz en lugar de en un orden fijo. Se usa cuando una palabra extra requerida puede flotar respecto al tallo.

  kill(ROOT)
  GAP
  suffix(yo OR ur OR your OR yor)
  suffix(self)
  ALSO(wrists OR wrist OR throat)

ALSO se reduce a un grupo flotante que se une en cualquier posición alcanzable después de la raíz y los grupos normales. Consulta Grupos plus para ver cómo coincide un grupo flotante.

GAP y LETTER

Estos atajos controlan lo que puede situarse entre las partes de un patrón.

Construcción Significado CompactaEVE
GAP Una serie opcional de caracteres cualesquiera (letras o no letras), así que se toleran espacios, puntuación o relleno insertados. (#*)
LETTERS Una serie opcional de letras únicamente. ($^)
LETTER Exactamente un carácter de material de palabra. @

GAP entre una raíz y un sufijo permite que una frase se reparta entre palabras:

  moon(ROOT)
  GAP
  suffix(cricket)
  PLURAL

Esto captura moon cricket, mooncricket y grafías con relleno entre las dos partes. LETTER coincide con un solo carácter, útil dentro de un brazo de sufijo para permitir una posición comodín:

  suffix(m LETTER GAP OR NONE)

LETTERS coincide con una serie de letras únicamente, así que se detiene en un espacio:

  my(ROOT)
  GAP
  LETTERS
  GAP
  suffix(hit)

Qué cuenta como letra

El material de palabra es una letra ASCII o cualquier byte de un glifo no ASCII, así que una serie de emojis o símbolos también cuenta como material de palabra para los límites y el comodín LETTER. El texto ASCII plano no se ve afectado.

OR y NONE

OR separa alternativas dentro de una construcción como suffix(...), NEVER(...), ALSO(...), BEFORE(...) y AFTER(...), y separa los miembros de clase en una declaración LET. Debe aparecer como una palabra completa.

NONE es una alternativa vacía. En un sufijo hace opcional la terminación; en una lista de miembros de función deja que la clase contribuya con una coincidencia vacía:

LET function(quantifier) BE NONE OR some OR any OR a OR an OR the

BEFORE y AFTER: regulación por contexto

Estos regulan una regla según el texto en otro lugar de la línea. Se usan para hacer que un término por lo demás amplio o ambiguo se dispare solo en un contexto revelador.

Construcción Significado CompactaEVE
BEFORE(...) Un precheck. La regla solo se activa cuando una de las frases listadas aparece en la línea circundante. {pre:...}
AFTER(...) Una condición posterior. Terminaciones permitidas que dejan que la regla se dispare sobre la palabra en sí incluso sin una frase de precheck presente. {post:...}
  BEFORE(function(seeking))
  cp
  AFTER(mega OR pack OR packs OR nz OR db OR dropbox OR folder OR vids OR pics)
  (WHOLE)

Una frase BEFORE es una comprobación de subcadena simple contra toda la línea, en minúsculas. Cuando una regla tiene una puerta BEFORE permanece inerte a menos que una de las frases esté presente, o a menos que la palabra satisfaga la condición posterior AFTER por sí sola. AFTER acepta un plural final s en sus terminaciones. Consulta Regulación para conocer la regla exacta.

SWAP: conjunto de sustitución en línea

SWAP(...) coincide con cualquiera de varios fragmentos pequeños en una posición, con control sobre los límites de palabra. Se usa donde una pieza corta intercambiable se sitúa dentro de una frase.

  kill(ROOT)
  GAP
  SWAP(my* OR me*)
  suffix(self)

Cada brazo puede llevar asteriscos que liberan un límite:

  • Un * inicial libera el inicio (el brazo no necesita empezar en un límite de palabra).
  • Un * final libera el fin.
  • Sin asterisco, o un ** inicial doble, ancla ambos lados a un límite de palabra.

Así, my* coincide con my con un límite requerido antes de él pero no necesariamente después, dejándolo fluir hacia self. Consulta Swaps para las reglas de límite completas.

SKELETON: grafías exactas

SKELETON(...) enumera formas de palabra exactas que la regla también coincide directamente, saltándose el matcher difuso. Se usa para fijar grafías ofuscadas específicas usando listas de opciones en línea.

  ni(ROOT)
  suffix(g OR ga OR gga OR gger OR gl LETTER t)
  PLURAL
  NEVER(snigger OR sniggers OR sniggered)
  SKELETON(n[a,e,i,o,u]gg[a,e,i,o,u]r OR n[a,e,i,o,u]gg[a,e,i,o,u]h)

Un skeleton se expande al conjunto completo de palabras concretas que puede deletrear, y cualquier candidato igual a una de esas palabras coincide inmediatamente. La expansión toma el producto cruzado de cada opción, así que n[a,e,i,o,u]gg[a,e,i,o,u]r produce naggar, neggar, niggar, y así sucesivamente para cada par de vocales.

Listas de opciones en línea

Dentro de un skeleton, [a,e,i,o,u] es una lista de opciones en línea: una posición de carácter que puede ser cualquiera de los miembros separados por comas. Los miembros pueden tener más de un carácter. Los espacios en blanco alrededor de un miembro se recortan. Un skeleton también puede referenciar una función con &name, que se expande a los miembros de esa función.

  SKELETON(r[e,i]t[a,e,i]rd)
  SKELETON(m[a,e,i,o,u]st[a,e,i,o,u]rb[a,e,i,o,u]t OR m[a,e,i,o,u]st[a,e,i,o,u]rb[a,e,i,o,u]t[a,e,i,o,u])

El resultado se pasa a minúsculas. Los skeletons coinciden con la grafía exacta, así que son complementarios a la raíz difusa, que gestiona las variantes más sueltas.

FUNCTION: clases con nombre

Una función es una clase con nombre declarada con LET (consulta El lenguaje EVE). Se referencia con function(name), y la referencia se expande a los miembros de la clase. Las funciones tienen varios roles según dónde aparezcan.

Como grupo completo de alternativas en el cuerpo de una regla:

  groom(ROOT)
  suffix(NONE OR ing OR ed)
  GAP
  MAYBE function(declarative)
  GAP
  function(vulnerable)

Como alias, donde cada miembro se convierte en una raíz alternativa:

  ALIAS(function(genderword))
  internal
  GAP
  condom(WHOLE)

Dentro de una lista suffix, NEVER, ALSO, BEFORE o AFTER, donde los miembros se unen a las alternativas:

  suffix(function(article) OR box of OR a box of OR internal OR function(genderword) OR NONE)

Modificadores de función

Una referencia function(...) puede llevar modificadores, unidos con +:

Modificador Efecto CompactaEVE
ADDITIVE La referencia es una adición flotante a la coincidencia en lugar de un requisito de orden fijo. se envuelve como un grupo plus [+[...]]
GAP La referencia coincide de forma suelta, permitiendo un hueco después de ella. añade (#*)
  function(subject + ADDITIVE + GAP)
  function(desire + ADDITIVE + GAP)
  function(quantifier + ADDITIVE + GAP)
  rap(ROOT)
  suffix(e OR ist OR ed OR ing OR eable OR able)
  PLURAL

Cada función aditiva aquí flota hacia la coincidencia dondequiera que encaje, así que las palabras de sujeto, deseo y cuantificador pueden aparecer en orden variable antes de la raíz.

MAYBE FUNCTION: función opcional

MAYBE FUNCTION(name) hace opcional una referencia de función: la coincidencia tiene éxito esté o no presente uno de sus miembros.

  rap(ROOT)
  suffix(NONE OR e OR es OR ed OR ing OR eing OR in OR ist OR ists)
  GAP
  MAYBE function(declarative)
  GAP
  function(vulnerable)

Aquí function(declarative) (palabras como a, the, my) puede aparecer o no entre el verbo y la palabra de persona vulnerable.

FLAG: reglas condicionales y etiquetado de categoría

FLAG(name YES) etiqueta la regla con una flag declarada. Cuando la regla se dispara, esa flag se establece, que es como el filtro reporta una categoría como autolesión o abuso en lugar de un bloqueo ordinario.

  kms(WHOLE)
  FLAG(sh YES)

El valor puede escribirse YES, Y o TRUE para activado, y cualquier otra cosa para desactivado. El nombre de la flag debe declararse con DEFINE (consulta El lenguaje EVE), o el documento no se carga. Por debajo, una flag envuelve el patrón en una puerta condicional; consulta Envoltorios de flag.

NOTE: comentarios

NOTE(...) adjunta un comentario en línea. Se elimina antes de la compilación y no afecta a la coincidencia, así que es una forma de anotar un patrón en el sitio. Los comentarios de línea completa siguen usando un # inicial.

ALIAS con marcadores WHOLE o ROOT

Un alias puede terminar en (WHOLE) o (ROOT) para establecer su propio límite, independiente del de la raíz:

  ALIAS(dike)
  dyke(WHOLE)

Sin un marcador final, el alias hereda el marcador de límite de la raíz.

Raíces segmentadas

Una raíz puede escribirse como varias piezas entre corchetes y desnudas para marcar parte de ella como flexible. Cuando hay al menos dos piezas presentes y al menos una está entre corchetes, se pliegan en una sola raíz con puntos de entrada alternativos.

  re[tard] (WHOLE)
  suffix(NONE OR d OR ded OR ted OR t OR der OR ders OR ing OR ed OR s)

La pieza entre corchetes marca el segmento flexible. Consulta Raíces segmentadas para saber exactamente qué alternativas se generan.

Poniéndolo todo junto

Una regla realista combina varias construcciones:

HEAR rule
AS
  ALIAS(masterb)
  masturb(ROOT)
  suffix(ate OR ating OR ation OR ated OR ates OR at)
  SKELETON(m[a,e,i,o,u]st[a,e,i,o,u]rb[a,e,i,o,u]t OR m[a,e,i,o,u]st[a,e,i,o,u]rb[a,e,i,o,u]t[a,e,i,o,u])

Esta regla tiene un alias para una falta de ortografía común, una raíz con un conjunto de sufijos fijo y skeletons para las grafías en leetspeak que el matcher difuso podría pasar por alto. Lee CompactaEVE para ver cómo se reduce y coincide cada una de estas.