# 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](page:eve/expanda) est la forme explicite que vous écrivez à la main. Elle utilise des mots comme `HEAR`, `SUFFIX`, `NEVER` et `PLURAL`.
- [CompactaEVE](page:eve/compacta) 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 :

```text
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.

!!! note "Quelle forme dois-je lire ?"
    Si vous écrivez ou lisez des fichiers `.eve`, commencez par [ExpandaEVE](page:eve/expanda). Lisez [CompactaEVE](page:eve/compacta) 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 :

```text
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.

```text
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](page:eve/expanda#flag-conditional-rules-and-category-tagging) 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 ...`.

```text
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 :

```text
LET function(frenchstuff) (WHOLE) BE franger OR frenchie OR jizzbag
```

Voir [Fonctions et classes](page:eve/expanda#function-named-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.

!!! note "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](page:eve/expanda#skeleton-exact-spellings) et la [liste des classes de caractères](page:eve/expanda#inline-choice-lists).

### 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.

```text
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](page:eve/compacta#strict-rules-match). |
| `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](page:eve/expanda).

!!! note "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

```text
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](page:eve/expanda) pour chaque construction utilisée ici.
