7
votes

Mise en œuvre de la classe de production de grammaire en C #

grammaire par définition contient des productions, exemple de grammaire très simple: xxx

Je tiens à mettre en œuvre la classe de grammaire en C #, mais je ne sais pas comment stocker des productions, par exemple comment Faites la différence entre le symbole terminal et non terminal. Je pensais à: xxx

gauche sera toujours symbole non terminal (il s'agit de grammaires sans contexte) Mais le côté droit de la production peut contenir des symboles Terminal et non-terminal

Donc, maintenant je pense que 2 voies de mise en œuvre:

  1. Les symboles non-terminaux seront écrits avec des supports, par exemple:

    E + E sera représenté sous forme de chaîne "[e] + [e]" "

  2. Créer une structure de données supplémentaire non atterminale

    struct non atomique { Symbole de chaîne; }

    et e + e sera représenté comme une matrice / liste: xxx

    mais pense qu'il y a de meilleures idées, il serait utile d'entendre une certaine réponse


6 commentaires

Avez-vous regardé antlr.org ? Ceci est un concepteur de langue comprenant une très belle IDE.


Il existe deux façons rapides de stocker des règles de grammaire. Lequel utiliser dépend du cas d'utilisation: voulez-vous produire des chaînes ou les analyser?


Si votre objectif est d'analyser les chaînes et que votre grammaire est statique, vous n'avez pas besoin d'une "classe de grammaire". Ce dont vous avez besoin est un analyseur synthétisé de la grammaire (qui est le commentaire précédent à propos d'AntlR est bon). Si votre grammaire change à caprice, mais vous n'utilisez pas de chaînes, toute représentation de la grammaire fera et vous pouvez pirater une descente récursive et / ou une parseur précoce pilotée par les règles de la grammaire. Si vous avez besoin d'une grammaire dynamique et de taux d'analyse élevée, vous aurez besoin d'un générateur d'analyseur et vous êtes de retour à quelque chose comme ANTLR.


@DFENS: Pourquoi avez-vous marqué cette "langue naturelle"? Les BNFS sont à peu près utilisés uniquement pour décrire les langauges artificiels (informatiques). Si vous voulez analyser la langue naturelle, vous avez besoin de quelque chose de plus sophistiqué.


@Ira Baxter: Mon objectif est de mettre en œuvre un analyseur, de ne pas utiliser un. il est marqué la langue naturelle car elle doit analyser toutes les grammaires sans context et surtout NL


D'abord, il y a trop d'analyseurs lexicaux et d'autres choses à travailler avec des grammaires, également si vous voulez écrire votre propre pourquoi vous voulez le faire en C #? Vous pouvez facilement le faire dans F #.


3 Réponses :


2
votes

Voici mon idée de stocker des productions: xxx

symbole est la classe parent (abstraite?) Classe pour Nonterie , Terminalalsymbol et production classe

donc dans votre exemple que le dictionnaire aurait une touche ("E") et deux valeurs correspondantes liste ("[e] + [e]" et "n").


3 commentaires

+1 pour la hiérarchie de l'objet, exactement mon idée. Cependant, ce dictionnaire codage n'est que bon pour la production, pas analyser.


Euh, que se passe-t-il si vous avez deux règles avec le même non mortminal? (Voir les règles d'exemple d'OP, par exemple). Les dictionnaires Afaik n'autorisent qu'un élément stocké par clé.


Oui, Ira a raison, envisagez E-> E + E, E-> n. Il n'y a qu'une seule entrée pour le côté gauche E dans votre structure.



0
votes

Peut-être qu'il serait utile d'utiliser des méthodes d'extension pour la deuxième méthode: xxx

donc cela ressemblerait à ce xxx

L'avantage de cette méthode est qu'il serait facile de modifier le code


0 commentaires

5
votes

J'utiliserais

   KleeneStar inherits_from TERM {
        T: TERM:
   }


0 commentaires