El lenguaje EVE

EVE es el motor de coincidencia de patrones que hay detrás del filtro de chat de Verité. Viene con su propio pequeño lenguaje para crear archivos de filtro. Esta página es la guía de nivel superior: qué es EVE, cómo se estructura un archivo de filtro y las directivas que componen un documento. Cada uno de los dos dialectos tiene su propia página:

  • ExpandaEVE es la forma explícita que escribes a mano. Usa palabras como HEAR, SUFFIX, NEVER y PLURAL.
  • CompactaEVE es la forma compilada concisa y la semántica del matcher que hay debajo. Cada construcción de ExpandaEVE se reduce a un símbolo de CompactaEVE antes de ejecutarse.

Qué es EVE

EVE lee un documento de filtro y produce un conjunto de reglas compiladas. Cada regla es un patrón que decide si una palabra candidata (o, para algunos tipos de regla, un mensaje entero) es una coincidencia. El motor es deliberadamente tolerante con la evasión: una regla difusa coincide a través de intercambios de vocales, huecos insertados, letras estiradas y trucos similares, así que una sola raíz creada captura muchas grafías sin que el autor enumere cada una.

Un archivo de filtro es texto plano UTF-8. Las líneas que están en blanco o comienzan con # se ignoran, así que # inicia un comentario de línea completa.

Las dos formas y cómo se relacionan

Tú creas en ExpandaEVE. Cuando se carga un documento, cada instrucción se traduce a CompactaEVE, y el CompactaEVE se compila en el matcher ejecutable. El flujo es:

ExpandaEVE source  ->  CompactaEVE source  ->  compiled rules
     (authoring)          (terse form)          (the matcher)

La traducción es puramente una reescritura. Todo lo que puedes expresar en ExpandaEVE se convierte en CompactaEVE real, y cada decisión de coincidencia la toma la forma compilada. Un documento también puede escribirse directamente en CompactaEVE: los verbos de instrucción son las mismas palabras en minúsculas (hear, match, let, define, realm, y así sucesivamente), y una instrucción que no use ninguna construcción exclusiva de ExpandaEVE pasa por el traductor casi textualmente.

¿Qué forma debería leer?

Si estás escribiendo o leyendo archivos .eve, empieza por ExpandaEVE. Lee CompactaEVE cuando quieras entender exactamente cómo coincide un patrón, o cuando estés leyendo la salida compilada.

Estructura del documento

Un documento es una secuencia de instrucciones, una por línea lógica. Las palabras clave de instrucción reconocidas son DEFINE, LET, REALM, HEAR, FIND, MATCH, ANYWHERE y SEQUENCE, más la línea de cabecera eve:. Cualquier línea que no esté en blanco, no sea un comentario y no comience con una palabra clave reconocida genera un error en lugar de omitirse.

La cabecera eve:

Una primera línea opcional declara la versión y el idioma:

eve: 1.0 English

El texto después de eve: hasta el primer espacio es la versión. El resto es el nombre del idioma. Ambos se registran en el programa compilado. Se acepta una cabecera con solo una versión y sin idioma.

DEFINE: declarar ids de flag

DEFINE registra un nombre de flag y el id al que se asigna. Cada flag que una regla establece con FLAG(...) debe declararse, o el documento no se carga.

DEFINE sh AS selfharm
DEFINE ea AS abuse
DEFINE pf AS profanity

El nombre de la izquierda es lo que las reglas referencian. El id de la derecha es la categoría que reporta el filtro. Consulta Flags para ver cómo las reglas los usan.

LET: definir una función (clase con nombre)

LET function(name) BE ... declara una clase con nombre: una lista de palabras o fragmentos intercambiables que una regla puede incorporar por nombre. En CompactaEVE la misma clase se escribe let &name be ....

LET function(genderword) BE female OR girl OR woman OR male OR guy OR guys OR men OR man

Los miembros se separan con OR. Una vez declarada, una clase se referencia en otro lugar con function(name) en ExpandaEVE o &name en CompactaEVE. Una referencia de clase se expande a todos sus miembros. Las clases pueden llevar un marcador (WHOLE) o (ROOT) por defecto en el nombre, que se hereda por las referencias a menos que la referencia lo anule:

LET function(frenchstuff) (WHOLE) BE franger OR frenchie OR jizzbag

Consulta Funciones y clases para la referencia completa, incluido cómo se usa una clase como raíz, como grupo, como alias y dentro de un skeleton.

Clases numeradas y vocales

Una clase cuyo nombre está hecho enteramente de dígitos contribuye con sus miembros de un solo carácter al conjunto de vocales integrado que usa la coincidencia relajada. Así es como se ensambla el alfabeto de vocales para la tolerancia al leetspeak. Consulta Skeletons y la lista de clases de caracteres.

REALM: agrupar reglas

REALM establece el realm al que pertenece cada regla siguiente, hasta el próximo REALM. Un realm es una etiqueta usada para organizar y delimitar reglas. No cambia cómo coincide una regla.

REALM racial_and_ethnic_slurs

Cada regla HEAR, FIND, MATCH, ANYWHERE y SEQUENCE que sigue lleva ese nombre de realm hasta que declares un realm diferente.

Las instrucciones de regla

Cinco instrucciones declaran reglas. Cada una se escribe como el verbo, un nombre, la palabra clave AS y un cuerpo. El nombre y el cuerpo pueden abarcar varias líneas: el cuerpo se extiende hasta la próxima palabra clave de instrucción al principio de una línea.

Instrucción Tipo de regla Coincide con
HEAR name AS ... Difusa Una sola palabra, tolerante con la evasión. Este es el caso común.
FIND name AS ... Difusa Idéntica a HEAR. Una grafía alternativa del mismo verbo.
MATCH name AS ... Estricta La entrada completa, con clases exactas y capturas. Consulta Reglas estrictas.
ANYWHERE name AS ... Anywhere Se dispara cuando cada grupo listado aparece en algún lugar del mensaje.
SEQUENCE name AS ... Sequence Una serie ordenada de glifos que aparecen en orden a lo largo del mensaje.

HEAR y FIND son el mismo tipo de regla, así que esta guía usa HEAR en todo momento. El cuerpo de una regla difusa es un patrón completo de ExpandaEVE: una raíz más cualquiera de las construcciones de la página de ExpandaEVE.

ANYWHERE y SEQUENCE

ANYWHERE construye una regla de coocurrencia: el cuerpo es una lista de grupos separados por WITH, y la regla se dispara solo cuando al menos un miembro de cada grupo se encuentra en algún lugar del mensaje. Cada miembro se compila como su propio matcher difuso de palabra completa, así que los miembros siguen tolerando la evasión. Una regla ANYWHERE necesita al menos dos grupos.

SEQUENCE se usa para patrones ordenados de símbolos y emojis y está documentada con el tablero de símbolos, que se cubre por separado. Se dispara cuando todos sus pasos de glifo aparecen en orden a lo largo del mensaje, y un prefijo mirror también acepta el orden invertido. Una regla SEQUENCE necesita al menos dos glifos.

Un archivo mínimo completo

eve: 1.0 English

DEFINE pf AS profanity

REALM profanity

HEAR rule
AS
  shit(WHOLE)
  suffix(NONE OR s OR ty OR head OR heads)
  NEVER(shitake OR shiitake OR mishit)
  FLAG(pf YES)

Esto declara una flag, abre un realm y añade una regla difusa. La regla coincide con la palabra completa shit con cualquiera de las terminaciones listadas, rechaza las palabras inocentes listadas y reporta la categoría profanity. Lee la referencia de ExpandaEVE para cada construcción usada aquí.