Pratiquement, pour un langage qui peut éventuellement être compilé / transformé en instructions au niveau du système, est-il nécessaire que ce soit une grammaire sans contexte?
ex: tous les langages de programmation / script sont-ils des grammaires sans contexte? Java est basé sur des CFG, mais est-il vrai que tous les langages de programmation sont basés sur des CFG?
Cela ne semble pas obligatoire, mais il y a des lacunes dans ma compréhension.
Un contexte pour la question: je regardais la spécification du langage Java, qui fournit également les règles de grammaire . Cela m'a fait réfléchir à cette question.
pl.programming-languages
context-free
sandeepkunkunuru
la source
la source
Réponses:
Deux fois non.
Premièrement, la plupart des HPL ne sont pas sans contexte. Bien qu'ils aient généralement une syntaxe basée sur un CFG, ils ont également ce que les gens appellent la sémantique statique (qui est également souvent incluse dans le terme syntaxe). Cela peut inclure des noms et des types qui doivent rechercher un programme correct. Par exemple,
est un programme Java syntaxiquement correct mais ne se compilera pas car il
d
n'est pas défini eta
n'a pas de type approprié.Deuxièmement, vous pouvez analyser des langages qui ne sont pas sans contexte (comme le prouve évidemment l'existence de compilateurs). C'est seulement que les CFG peuvent être analysés efficacement, tandis que les CSG ne le peuvent pas, en général. Cependant, vous pouvez ajouter certaines fonctionnalités non contextuelles tout en restant efficace.
Les compilateurs s'exécutent souvent par phases: d'abord la tokenisation (régulière), puis l'analyse sans contexte, puis l'analyse des noms et des types (contextuelle, parfois même plus difficile). Vous pouvez observer ce comportement par le type de messages d'erreur que vous obtenez.
la source
public class Program { public static void main(String[] args) { ... } }
... Java ne vous laissera pas partir aussi facilement. :-)class A { ... }
c'est tout à fait suffisant pourjavac
compiler des choses que vous ne pouvez pas réellement exécuter (faute de point d'entrée). Mais oui.L'analyse de perl n'est pas décidable.
http://www.jeffreykegler.com/Home/perl-and-undecidability/perl-and-undecidability-files/TPR3.pdf?attredirects=0
http://www.perlmonks.org/?node_id=663393
la source
Je ne crois pas que la grammaire de Python soit sans contexte. L'exigence que les lignes dans le même bloc de code aient la même quantité d'indentation n'est pas le genre de chose que les grammaires sans contexte gèrent bien.
Plus précisément, il semble y avoir un homomorphisme du langage des blocs Python de la forme
à la langue non contextuelle où le premier bloc de zéros vient de l'ensemble des espaces au début de la ligne 1, le deuxième bloc vient l'ensemble des espaces au début de la ligne 2, le troisième bloc provient de l'ensemble des espaces au début de la ligne 3, et les lignes restantes avec le reste, etc. sont là pour forcer la ligne 1, la ligne 2 et la ligne 3 à appartenir au même bloc.0n10n10n
la source
foo * bar;
une déclaration defoo
comme un pointeur versbar
ou une multiplication defoo
foisbar
?Bodo Manthey et Martin Böhme montrent que chaque compilateur C ++ est nécessairement Turing complet, c'est-à-dire qu'il peut calculer n'importe quelle fonction récursive partielle au moment de la compilation . C'est donc bien pire que simplement sensible au contexte.
http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf
la source
Je pense que la déclaration avant utilisation des variables et le polymorphisme de fonction des langages POO sont d'autres exemples de spécifications de langages de programmation qui ne peuvent pas être gérées par des grammaires sans contexte:
J'ai fait une petite recherche sur Google et j'ai trouvé cet article: " Une grammaire booléenne pour un langage booléen simple " par A.Okhotin (2004); selon lui, le vrai problème est de trouver un langage de programmation complètement décrit par une grammaire formelle:
Un langage de programmation procédural jouet est défini, et une grammaire booléenne pour l'ensemble des programmes bien formés dans ce langage est construite. Il s'agit apparemment de la première spécification d'un langage de programmation entièrement par une grammaire formelle.
La section Introduction de l'article est courte mais très claire.
la source
Je pense que la grammaire de C n'est techniquement pas contextuelle dans la mesure où les analyseurs utilisent toujours des techniques non contextuelles pour prendre en charge l'appareil de Duff .
Les langages basés sur l'indentation ne sont pas naturellement non plus contextuels, comme l'a dit David, mais ils deviennent indépendants du contexte par rapport à un jeton d'indentation paramétré.
Haskell vous permet de modifier la priorité des opérateurs avec infix et infixl. Le module pragma strict de Perl est implémenté en utilisant les paramètres lexicaux $ ^ H et% ^ H, ce qui le rend non contextuel, probablement d'autres paramètres également.
Il existe des langages de développement de macro comme TeX dans lesquels l'analyse afaik n'a pas de sens sans exécution.
Il existe probablement même deux grammaires sans contexte dont l'intersection n'est pas sans contexte mais décrit toujours une machine de Turing.
Java et l'assembleur sont probablement tous deux naturellement hors contexte.
la source
(a)-b
rendu C n'est-elle pas contextuelle? (a
pourrait être une variable ou un typedef - certaines autres langues ne permettent pas deNon, et de nombreuses langues pratiques ne sont pas sans contexte. Par exemple, la grammaire C ++ ne l'est pas, car dans certains contextes, la résolution de la grammaire dépend de la saisie d'informations qui ne sont pas hors contexte.
la source
Permettez-moi d'abord de faire une distinction entre la syntaxe d'un langage de programmation et le langage lui-même.
La syntaxe de nombreuses langues est (au moins basée sur) une grammaire sans contexte (CFG) car elles sont bien étudiées et il existe des algorithmes qui peuvent analyser efficacement un CFG et le cas de bord qui ne peut pas être résolu par le CFG peut être géré spécialement
Cependant, de nombreux langages ne sont en fait pas sans contexte (lorsque des symboles de déclaration avant utilisation sont utilisés, par exemple en java, C (++), D).
Fait amusant: D a une évaluation de la fonction de compilation complète de Turing et une extension de modèle rendant le langage lui-même non décidable par Turing. Cependant, le créateur du langage s'est donné beaucoup de mal pour faire de la syntaxe un CFG.
la source
En ce qui concerne les «grammaires sans contexte de tous les langages de programmation / scripting? partie est concernée, la réponse est un non.
Re: la question principale de "pour un langage qui peut éventuellement être compilé / transformé en instructions de niveau système", je ne sais pas pourquoi il doit nécessairement être un CFG. Cependant, il pourrait y avoir de meilleures explications à venir.
la source
Un langage de programmation doit être basé sur une sorte de formalisme grammatical, dont les CFG sont un exemple. Alors que les CFG sont les plus courants (et sont la chose habituelle enseignée dans les cours de compilateur dans les universités), il existe d'autres formalismes tels que les grammaires d'expression syntaxique, que vous pouvez lire ici (pdf) ou sur Wikipedia pour une lecture plus petite.
la source