Le langage EVE

EVE est le moteur de correspondance de motifs derrière le filtre de chat de Verité. Il est livré avec son propre petit langage pour rédiger des fichiers de filtre. Cette page est le guide de premier niveau : ce qu’est EVE, comment un fichier de filtre est structuré, et les directives qui composent un document. Les deux dialectes ont chacun leur propre page :

  • ExpandaEVE est la forme explicite que vous écrivez à la main. Elle utilise des mots comme HEAR, SUFFIX, NEVER et PLURAL.
  • CompactaEVE est la forme compilée concise et la sémantique de correspondance qui la sous-tend. Chaque construction ExpandaEVE est abaissée en un symbole CompactaEVE avant de s’exécuter.

Ce qu’est EVE

EVE lit un document de filtre et produit un ensemble de règles compilées. Chaque règle est un motif qui décide si un mot candidat (ou, pour certains types de règles, un message entier) correspond. Le moteur est délibérément tolérant à l’évitement : une règle floue correspond à travers les échanges de voyelles, les intervalles insérés, les lettres étirées et des astuces similaires, de sorte qu’une seule racine rédigée attrape de nombreuses orthographes sans que l’auteur ne liste chacune d’elles.

Un fichier de filtre est du texte UTF-8 brut. Les lignes vides ou commençant par # sont ignorées, donc # amorce un commentaire de ligne entière.

Les deux formes et comment elles se rapportent

Vous rédigez en ExpandaEVE. Lorsqu’un document est chargé, chaque énoncé est traduit en CompactaEVE, et le CompactaEVE est compilé en le matcheur exécutable. Le flux est :

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

La traduction est purement une réécriture. Tout ce que vous pouvez exprimer en ExpandaEVE devient du CompactaEVE réel, et chaque décision de correspondance est prise par la forme compilée. Un document peut aussi être écrit directement en CompactaEVE : les verbes d’énoncé sont les mêmes mots en minuscules (hear, match, let, define, realm, et ainsi de suite), et un énoncé qui n’utilise aucune construction propre à ExpandaEVE passe par le traducteur presque verbatim.

Quelle forme dois-je lire ?

Si vous écrivez ou lisez des fichiers .eve, commencez par ExpandaEVE. Lisez CompactaEVE lorsque vous voulez comprendre exactement comment un motif correspond, ou lorsque vous lisez la sortie compilée.

Structure d’un document

Un document est une séquence d’énoncés, un par ligne logique. Les mots-clés d’énoncé reconnus sont DEFINE, LET, REALM, HEAR, FIND, MATCH, ANYWHERE et SEQUENCE, plus la ligne d’en-tête eve:. Toute ligne qui n’est pas vide, pas un commentaire, et ne commence pas par un mot-clé reconnu lève une erreur plutôt que d’être ignorée.

L’en-tête eve:

Une première ligne facultative déclare la version et la langue :

eve: 1.0 English

Le texte après eve: jusqu’au premier espace est la version. Le reste est le nom de la langue. Les deux sont enregistrés sur le programme compilé. Un en-tête avec seulement une version et sans langue est accepté.

DEFINE : déclarer des ids de flag

DEFINE enregistre un nom de flag et l’id auquel il est associé. Chaque flag qu’une règle définit avec FLAG(...) doit être déclaré, sinon le document échoue au chargement.

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

Le nom à gauche est ce que les règles référencent. L’id à droite est la catégorie que le filtre rapporte. Voir Flags pour la manière dont les règles les utilisent.

LET : définir une fonction (classe nommée)

LET function(name) BE ... déclare une classe nommée : une liste de mots ou de fragments interchangeables qu’une règle peut invoquer par son nom. En CompactaEVE, la même classe s’écrit let &name be ....

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

Les membres sont séparés par OR. Une fois déclarée, une classe est référencée ailleurs avec function(name) en ExpandaEVE ou &name en CompactaEVE. Une référence de classe s’étend en tous ses membres. Les classes peuvent porter un marqueur (WHOLE) ou (ROOT) par défaut sur le nom, hérité par les références sauf si la référence le redéfinit :

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

Voir Fonctions et classes pour la référence complète, y compris comment une classe est utilisée comme racine, comme groupe, comme alias, et à l’intérieur d’un squelette.

Classes numérotées et voyelles

Une classe dont le nom est entièrement composé de chiffres contribue ses membres à caractère unique à l’ensemble de voyelles intégré que la correspondance relâchée utilise. C’est ainsi que l’alphabet de voyelles pour la tolérance au leetspeak est assemblé. Voir Squelettes et la liste des classes de caractères.

REALM : regrouper les règles

REALM fixe le domaine auquel appartient chaque règle suivante, jusqu’au prochain REALM. Un domaine est une étiquette utilisée pour organiser et délimiter les règles. Il ne change pas la manière dont une règle correspond.

REALM racial_and_ethnic_slurs

Chaque règle HEAR, FIND, MATCH, ANYWHERE et SEQUENCE qui suit porte ce nom de domaine jusqu’à ce que vous déclariez un domaine différent.

Les énoncés de règle

Cinq énoncés déclarent des règles. Chacun s’écrit comme le verbe, un nom, le mot-clé AS, et un corps. Le nom et le corps peuvent s’étendre sur plusieurs lignes : le corps court jusqu’au prochain mot-clé d’énoncé en début de ligne.

Énoncé Type de règle Correspond à
HEAR name AS ... Floue Un seul mot, tolérant à l’évitement. C’est le cas courant.
FIND name AS ... Floue Identique à HEAR. Une orthographe alternative du même verbe.
MATCH name AS ... Stricte L’entrée entière, avec des classes et des captures exactes. Voir Règles strictes.
ANYWHERE name AS ... Anywhere Se déclenche lorsque chaque groupe listé apparaît quelque part dans le message.
SEQUENCE name AS ... Sequence Une suite ordonnée de glyphes apparaissant dans l’ordre à travers le message.

HEAR et FIND sont le même type de règle, donc ce guide utilise HEAR partout. Un corps de règle floue est un motif ExpandaEVE complet : une racine plus l’une des constructions de la page ExpandaEVE.

ANYWHERE et SEQUENCE

ANYWHERE construit une règle de cooccurrence : le corps est une liste de groupes séparés par WITH, et la règle ne se déclenche que lorsqu’au moins un membre de chaque groupe est trouvé quelque part dans le message. Chaque membre est compilé comme son propre matcheur flou de mot entier, de sorte que les membres tolèrent toujours l’évitement. Une règle ANYWHERE nécessite au moins deux groupes.

SEQUENCE est utilisé pour les motifs ordonnés de symboles et d’emojis et est documenté avec le tableau de symboles, qui est couvert séparément. Elle se déclenche lorsque ses étapes de glyphes apparaissent toutes dans l’ordre à travers le message, et un préfixe mirror accepte aussi l’ordre inversé. Une règle SEQUENCE nécessite au moins deux glyphes.

Un fichier minimal complet

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)

Ceci déclare un flag, ouvre un domaine et ajoute une règle floue. La règle correspond au mot entier shit avec l’une des terminaisons listées, refuse les mots innocents listés, et rapporte la catégorie profanity. Lisez la référence ExpandaEVE pour chaque construction utilisée ici.