J'essaie de comprendre les grammaires contextuelles.
Je comprends pourquoi des langues comme
ne sont pas sans contexte, mais ce que j'aimerais savoir si un langage similaire au calcul lambda non typé est sensible au contexte.
J'aimerais voir un exemple d'un jouet simple, mais non-jouet (je considère les exemples de jouets ci-dessus), un exemple d'une grammaire contextuelle qui peut, pour une règle de production, par exemple, dire si oui ou non une chaîne de symboles est actuellement dans le champ d'application (par exemple lors de la production du corps d'une fonction).
Les grammaires sensibles au contexte sont-elles suffisamment puissantes pour faire des variables non définies / non déclarées / non liées une erreur syntaxique (plutôt que sémantique)?
Réponses:
Oui, je pense que cela est possible, mais non, je ne suis pas disposé à construire explicitement cette grammaire contextuelle. Je vais expliquer ma réponse, en divisant la question en deux parties différentes.
(1) Quel serait l'exemple non-jouet? Il doit refléter la déclaration des variables. Ma proposition d'un tel langage, abstrait de la vraie programmation serait quelque chose comme ça. L'alphabet est . { w 1 ; w 2 ; … ; w n ( x 1 ; x 2 ; … ; x m ) ∣ w i , x j ∈ { a , b{a,b,;,(,)}
Cette langue est contextuelle.
(2) Pour montrer que cela dépend du contexte, j'utiliserais un autre formalisme. Celui d'une machine de Turing à utilisation linéaire de sa bande: un automate linéaire borné LBA. Je peux le programmer pour faire la correspondance de motifs / Je considérerais consécutivement chaque et j'essaierais de le faire correspondre avec un bon , lettre par lettre. Les LBA sont équivalents aux grammaires contextuelles, mais beaucoup plus faciles à programmer.w jxj wj
la source
Mon exemple préféré de langage contextuel (CSL) est SAT . Le théorème de Landweber-Kuroda dit que CSL = NSPACE . Toute instance SAT a un certificat de taille linéaire, donc SAT est une CSL. Voir ma question Grammaire contextuelle pour SAT? pour références et discussion.[n]
De nombreux autres langages NP-hard sont également en CSL pour la même raison, comme CLIQUE.
Il existe également des langues assez naturelles dans CSL qui sont encore plus difficiles.
Cependant, je ne connais aucun moyen d'exprimer un CSL arbitraire comme une grammaire contextuelle (CSG), autre que d'utiliser la construction de Landweber dans le théorème 3 de son article. Dans cette construction, le CSG décrit l'inverse du fonctionnement de l'automate borné linéaire qui reconnaît le CSL. Les productions du CSG décrivent comment un état particulier de la machine résulte d'un mouvement possible. Un tel CSG est une traduction simple de l'automate dans une grammaire, il ne correspondra donc pas nécessairement aux fonctionnalités du langage telles que la possibilité de déclarer des variables, mais sera plutôt embourbé par les détails de l'automate.
Si vous insistez sur un CSG plutôt que sur un CSL, et si votre véritable question concerne spécifiquement le fait de vouloir voir un CSG pour un langage qui implique une portée restreinte des variables, alors la réponse d'Hendrik Jan semble être un bon début.
la source
Oui, les grammaires contextuelles (CSG) sont suffisamment puissantes pour vérifier les variables non définies / non déclarées / non liées, mais malheureusement nous ne connaissons aucun algorithme efficace pour analyser les chaînes de CSG.
Un véritable exemple de langage contextuel est le langage de programmation C. Une fonctionnalité telle que déclarer des variables en premier et les utiliser ensuite fait du langage C un langage contextuel (CSL). ( Je ne connais pas le calcul lambda non typé ).
Et parce que nous ne connaissons aucun algorithme d'analyse linéaire pour CSL (ou CSG). C'est la raison dans la conception du compilateur, nous utilisons CFG (et son algorithme d'analyse uniquement) pour la vérification de la syntaxe car nous connaissons des algorithmes efficaces pour analyser CFG (s'il est sous forme restreinte). Les compilateurs analysent d'abord une fonctionnalité sans contexte, puis gèrent ultérieurement les fonctionnalités contextuelles de manière problématique (par exemple, vérifient toute variable utilisée dans la table des symboles si elle est définie. Sinon, elle génère une erreur).
La grammaire contextuelle est également utilisée dans le traitement du langage naturel (NLP). Et la plupart des langues naturelles sont des exemples de langues contextuelles. (Je ne suis pas sûr de la langue sanskrite ).
Je vais essayer de l'expliquer avec un exemple idiot mais simple (c'est juste une idée, vous pouvez l'affiner):
Maintenant, en utilisant cette grammaire, nous pouvons générer des déclarations correctes, mais certaines se trompent également. Par exemple,
Mais
Raison: la valeur de <TENSE> dépend de la valeur <NOUN> (par exemple,
I <TENNSE> --> I am
) et donc la grammaire ne génère pas de déclarations correctes en anglais.En fait, nous ne pouvons pas écrire une grammaire sans contexte pour un anglais complet!
Vous l'avez peut-être remarqué, tout traducteur en langage naturel ou vérificateur de grammaire ne fonctionne pas correctement (essayez avec de longues instructions). Parce que ce problème relève de l'algorithme d'analyse contextuelle.
RÉFÉRENCE : Vous pouvez regarder les conférences du Dr Arun Kumar . Dans une conférence, il explique exactement ce qui vous intéresse.
la source
(extension des commentaires en réponse)
Pas sûr que ce soit un exemple que vous aimeriez de toute façon.
Presque tous les vrais langages de programmation sont sensibles au contexte (dans le sens général, c'est-à-dire confondant les grammaires Chomsky de type 0 et de type I sous "context-sensitive", ce qui est vrai bien sûr puisque les grammaires non restreintes sont encore plus contextuelles que le contexte - grammaires sensibles ).
Par exemple, "les variables doivent être déclarées avant d'être utilisées", "les identifiants doivent être uniques", tous ces éléments nécessitent un contexte (parfois appelé contexte sémantique, mais qui peut être trompeur, car il implique de toute façon des caractéristiques syntaxiques) voir par exemple https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf
Le sentiment que les exemples ci-dessus sont sensibles au contexte (au sens grammatical / syntaxique et sémantique) est parce qu'ils parlent de leur contexte (ce qui précède ou vient après).
Une "variable déjà définie", concerne le contexte précédent , une utilisation de variable. Un "identifiant unique" est le contexte à la fois de ce qui précède ou vient après une déclaration d'identifiant, etc.
voir aussi JavaScript est-il un langage sans contexte? sur SO
la source