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 ?
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.
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 |
|
|
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):