Introduction aux grammaires hors-contexte par un exemple: la définition du langage des expressions régulières

Essayons de définir le langage des expressions régulières (comme un langage régulier)

Nous écrivons AL = {a, b, c} pour l'alphabet des langages qui seront définis par les expressions régul

Maintenant nous définissons le langage de toutes les expressions régulières qui définissent un language sur l'alphabet AL. Ce langage d'expressions régulières est un méta-langage. Appellons-le RE. L'alphabet de RE est {a, b, c, epsi, con, or, star, open, close} ou {a, b, c, є, ., |, *, (, )} or {a, b, c, "є", ".", "|", "*", "(", ")"}

Équations de langages resursive - définition du langage RE:

Comme discuté auparavent, on peut trouver une solution à ce système d'équations: notez que LG = L1 |  LG .L2 a la solution LG = L1 . L2 * ; nous obtenons C = B ( "." B )* -- RE = C ( "|" C )* ---- donc RE = ( ( B ( "." B )* ) ( "|" ( B ( "." B )* ) )* ) où B = Sim ("*" )*

Mais il faut aussi accommoder les parenthèses: B = Sim | B "*" | "(" RE ")"

Le diagramme ci-dessous est un automate d'états finis (étendu avec recursivité) qui accepte les parenthèses dans la branch en bas. Avec cette branche "(" RE ")", l'automate devient un automate recursif. Il peut être utilisé pour vérifier si une séquence de symboles est une expression régulière valable. Mais, aucun automate d'états fini (sans recursion) existe qui pourrait faire ce travail. Pourquoi pas ?

automaton

Exercice: Resoudre le système d'équation recursif ci-haut par iteration

niveau 0 niveau 1 niveau 2 niveau 3 niveau 4 niveau 5  
RE = Ø RE = Ø RE = Ø RE = Ø RE = a | b | c | "є"

RE = a | b | c | "є" | ( a | b | c | "є" ) "." (a | b | c | "є" | a* | b* | c* )

| (a | b | c | "є" ) "|" (a | b | c | "є" | ( a | b | c | "є" ) "." (a | b | c | "є" | a* | b* | c* ))

 
C = Ø C = Ø C = Ø C = a | b | c | "є"

C = a | b | c | "є"

| ( a | b | c | "є" ) "." (a | b | c | "є" | a* | b* | c* )

C = a | b | c | "є" | a* | b* | c* | a** | b** | c**

| (a | b | c | "є" | ( a | b | c | "є" ) "." (a | b | c | "є" | a* | b* | c* ) ) "." (a | b | c | "є" | a* | b* | c* | a** | b** | c**)

 
B = Ø B = Ø B = a | b | c | "є" B = a | b | c | "є" | a* | b* | c* B = a | b | c | "є" | a* | b* | c* | a** | b** | c** B = a | b | c | "є" | a* | b* | c* | a** | b** | c** | a*** | b*** | c*** | "(" ( a | b | c | "є" ) ")"  
Sim = Ø Sim = a | b | c | "є" Sim = a | b | c | "є" Sim = a | b | c | "є" Sim = a | b | c | "є" Sim = a | b | c | "є"  

Note: Chaque séquence qui appartient à RE, C, B ou Sim peut aussi être représentée par un arbre où les noeuds feuilles sont des symboles de l'alphabet et le noeuds internes et la racine correspondent aux (RE, C, B et Sim) qui représentent des ensembles de chaînes. Des exemples seront donnés en classe.

Définir une grammaire hors-contexte pour les expressions régulières

Nous pouvons ré-écrire les equations recursives dans la forme d'une grammaire comme suit:

We can write the recursive equations above in the form of a context-free grammar as follows:

Grammaire hors-contexte La même grammaire, écrite ici avec des règles de production séparées, chacune identifiée par un numéro
  • RE --> C | RE "|" C
  • C --> B | C "." B
  • B --> Sim | B "*" | "(" RE ")"
  • Sim --> a | b | c | "є"
  1. RE --> C
  2. RE --> RE "|" C
  3. C --> B
  4. C -->C "." B
  5. B --> Sim
  6. B -->B "*"
  7. B -->"(" RE ")"
  8. Sim --> a | b | c | "є"

Notes:

Arbres syntaxiques

The syntax tree of a sequence of terminal symbols explains why the sequence is part of the language according to the syntax rules of the context-free grammar. Consider the following example (a):

syntax trees