Il s'agit d'une reformulation des programmes de grammaires Are? précédent demandé par Vag et avec de nombreuses suggestions des commentateurs.
De quelle manière une grammaire peut-elle être considérée comme spécifiant un modèle de calcul? Si, par exemple, nous prenons une grammaire simple sans contexte telle que
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
En supposant que l'analyseur ne fait pas de distinction entre les terminaux et non terminaux symboles comme je l' ai démontré ici, alors il est possible d'effectuer des opérations arithmétiques simples pour les nombres jusqu'à 3.
Par exemple, prenez la chaîne
"2 + 0 + 1"
L'exécution d'un analyseur LR (1) sur cette chaîne devrait nous donner l' arbre de syntaxe concret suivant où le résultat du calcul est stocké à la racine de l'arbre:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Ainsi, si nous considérons une grammaire comme un programme et un générateur d'analyseur comme un compilateur , pourrions-nous voir le langage de spécification de la grammaire comme un langage de programmation ?
De plus, pourrions-nous construire des programmes complets de Turing en spécifiant des grammaires similaires à la façon dont vous pourriez construire des programmes complets de Turing avec des automates celullaires ou le calcul lambda ?
En d'autres termes, on sait que dans le sens de la reconnaissance d' un langage, les langages réguliers correspondent à des automates à états finis , les langages sans contexte correspondent à des automates à pousser vers le bas et les langages contextuels correspondent à des automates bornés linéaires . Cependant, si nous considérons les grammaires comme des dispositifs de calcul (c'est-à-dire des programmes au sens de l'exemple ci-dessus), comment classer la force de calcul de chaque classe de grammaires dans la hiérarchie de Chomsky?
- Grammaires régulières
- Grammaires sans contexte
- Grammaires contextuelles
- Grammaires illimitées (pour les langues récursivement énumérables )
Aussi, que diriez-vous des sous-classes de grammaires moins connues telles que
- Grammaires déterministes sans contexte (également LR (k) / LL (k) / SLR / LALR etc.)
- Grammaires de mots imbriquées
- Arborescence des grammaires adjacentes
- Grammaires indexées
EDIT: Soit dit en passant, c'est une réponse à ma propre question, mais je n'ai pas mentionné que je n'ai donné aucun symbole de départ pour l'exemple de grammaire et fait signe de la main à la nécessité de faire la distinction entre les terminaux et les non terminaux. Techniquement ou traditionnellement, je pense que la grammaire devrait probablement être écrite sous une forme plus compliquée comme celle-ci (où S est le symbole de départ et le $ représente le terminal de fin de flux):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... pas que ça change vraiment quelque chose, mais j'ai pensé que je devais le mentionner.
EDIT: Une autre chose qui m'est venue à l'esprit lorsque j'ai lu la réponse de gasche est que chaque branche de l'arbre dans mon exemple représente un sous-calcul. Si vous regardez chaque règle de production comme une fonction où le LHS représente le résultat et le RHS représente ses arguments, la structure de la grammaire détermine la façon dont les fonctions sont composées.
En d'autres termes, le contexte de l'analyseur avec son mécanisme d'anticipation aide à déterminer non seulement les fonctions à appliquer (un peu comme le polymorphisme paramétrique), mais comment elles doivent être composées ensemble pour former de nouvelles fonctions.
Au moins, je suppose que vous pourriez le voir de cette façon pour les CFG sans ambiguïté, pour les autres grammaires, la gymnastique mentale est un peu trop pour moi en ce moment.