Expressions rationnelles dans les fichiers sources pour LEX

Espace et tabulation séparent l'expression rationnelle du code qui lui est associé tandis que le retour à la ligne séparent les règles de production du fichier-lex ; il faut donc considérer ces trois caractères comme des caractères réservés. Pour les utiliser dans une règle, on utilisera respectivement  " " ou [ ], \t, et \n.

Les caractères suivants ont une signification spéciale (méta-caractères) :
  $  \  ^  (  )  [  ]  {  }  <  >  +  -  *  /  |  ?  .  "  %

Le comportement de ces caractères peut varier selon leur contexte ; par exemple entre crochets seuls restent méta-caractères :
  \  en toute position,
  ^  seulement s'il est en début,
  -  seulement s'il n'est ni au début ni à la fin,
  {} peut délimiter une définition (si '{' est en début de ligne) ou un nombre d'occurrence.
Entre parenthèses et entre accolades (donc dans les définitions), on ne peut trouver ni  $  ni   ^  ni  /

Lex fait la différence entre les minuscules et les majuscules.
 
Expression signification
(E est une expression, c est un caractère)
E l'expression E avec interprétation des méta-caractères de Lex
"E"la chaine E littéralement, avec les méta-caractères de la convention ANSI-C
(E) E elle-même (voir les règles de priorités(1))
{E} l'identificateur E tel que défini dans la deuxième partie
<X>E (en début de ligne) rechercher l'expression E uniquement dans la configuration X, définie dans la deuxième partie
N.B. il peut y avoir plusieurs configurations, apr exemple pour deux  <X1,X2>.
[c1-c2] n'importe quel caractère entre c1 et c2 (ordre du code ASCII)
[c1-c2c3-c4] entre c1 et c2 ou entre c3 et c4 (ordre du code ASCII)
[E] n'importe quel caractère (un caractère) de E (attention : règle particulière pour -)
[^E]n'importe quel caractère qui n'est pas dans E
^EE en début de ligne (^ doit être le premier caractère de la règle)
E$E en fin de ligne ($ doit être le dernier caractère de la règle)
.n'importe quel caractère sauf \n
\c interprétation selon la convention ANSI-C si c est un caractère ASCII autorisé (à éviter sinon)
\n : retour à la ligne Unix (càd \x5C)
\t : tabulation horizontale (càd \x09)
\\ : caractère '\'
\" : caractère guillemet
...
\042le caractère de code octal 42 (guillemet, pour cette valeur)
\x22le caractère de code hexadécimal 22 (guillemet, pour cette valeur)
E?0 ou 1 occurrence de E(1)
E*0, une ou plusieurs occurrences de E(1)
E+une ou plusieurs occurrences de E(1)
E{n}exactement n occurrences de E
E{n,p}entre n et p occurrences de E
E{n,}au moins n occurrences de E
E1|E2si possible E1, sinon E2
E1/E2 l'expression E1 seulement si elle est suivie(2) de E1

(1) L'usage des parenthèses dépend des règles de priorités, qui peuvent être différentes pour Lex et pour Flex :
truc|machin*  est interprété comme  (truc)|(machi(n*))
abc{1,3}  est interprété par Lex comme  (abc){1,3}  et par Flex comme  ab(c{1,3})
^truc|machin  est interprété par Lex comme (^truc)|machin  et pas ^(truc|machin)
truc{def}*  est interprété comme  (truc{def})*  par Lex et comme  truc({def})*  par Flex
Autre différence majeure : Lex prend la suite de motifs dans l'ordre où ils se présentent, tandis que Flex prend en priorité le plus long motif (même si un motif subsumé apparait avant).

(2) L'expression E1 n'est extrait du flot d'entrée que si elle est suivi de l'expression E2 qui, elle, reste dans le flot d'entrée (plus exactement elle y est remise après extraction). Ce procédé (appelé trailing context) dépasse le cadre d'une simple analyse syntaxique. Son usage (comme celui de REJECT et de %option yylineno) ralentit notablement la vitesse d'exécution du programme et doit être réservé à un usage expert de Lex.