grammaire par définition contient des productions, exemple de grammaire très simple: 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 à: p> 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 P> Donc, maintenant je pense que 2 voies de mise en œuvre: p> Les symboles non-terminaux seront écrits avec des supports, par exemple: p>
E + E sera représenté sous forme de chaîne "[e] + [e]" " p> li>
Créer une structure de données supplémentaire non atterminale p>
struct non atomique
{
Symbole de chaîne;
} p> li>
ol> et e + e sera représenté comme une matrice / liste: p> mais pense qu'il y a de meilleures idées, il serait utile d'entendre une certaine réponse p> p>
3 Réponses :
Voici mon idée de stocker des productions: où p> donc dans votre exemple que le dictionnaire aurait une touche ("E") et deux valeurs correspondantes liste ("[e] + [e]" et "n"). p> p> symbole code> est la classe parent (abstraite?) Classe pour
Nonterie code>,
Terminalalsymbol code> et
production code> classe p>
+1 pour la hiérarchie de l'objet, exactement mon idée. Cependant, ce dictionnaire code> codage code> 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.
Peut-être qu'il serait utile d'utiliser des méthodes d'extension pour la deuxième méthode: donc cela ressemblerait à ce p> L'avantage de cette méthode est qu'il serait facile de modifier le code p> p>
J'utiliserais
KleeneStar inherits_from TERM { T: TERM: }
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 #.