Question

Je suis nouveau dans le monde des compilateurs, et moi avons récemment entendu parler de quelque chose appelé un générateur d'analyseur. D'après ce que je (crois), je l'ai compris, générateurs d'analyseur prennent dans un fichier de syntaxe et la sortie d'un fichier de code source qui peut analyser les fichiers avec la syntaxe donnée.

Quelques questions:

  1. Ai-je bien compris?

  2. Si oui, est-Ragel un tel outil?

  3. Si elle est, peut produire Ragel un analyseur D dans le code source D?

Merci!

Était-ce utile?

La solution

  1. C'est essentiellement cela. générateurs Parser transforment une grammaire dans un fichier source qui peut être utilisé pour reconnaître des chaînes qui sont membres du langue défini par la grammaire. Souvent, mais pas toujours, un générateur d'analyseur nécessite un analyseur lexical pour diviser le texte vers le bas en jetons avant qu'il fasse son travail. Lex et Yacc sont des exemples classiques d'un analyseur lexical et un générateur couplé analyseur.

    générateurs d'analyseur modernes offrent des fonctionnalités supplémentaires. Par exemple, ANTLR peut générer du code pour l'analyse lexicale, analyse grammaticale, et même marcher l'arbre de syntaxe abstraite générée. Elkhound génère un analyseur qui utilise le GLR parsing algorithme. Cela lui permet de reconnaître une gamme plus large de langues que des algorithmes d'analyse non-généralisées. PEG Parsers ne nécessitent pas un analyseur lexical distinct.

  2. Ragel génère en fait un analyseur lexical sous la forme d'une machine à états finis. Il peut reconnaître un langue régulière mais pas contexte sans langue . Cela signifie qu'il ne peut pas reconnaître la plupart des langages de programmation, y compris D.

  3. Ragel génère des codes D si vous avez besoin d'un analyseur lexical rapide.

Pour bien comprendre ce qu'est un générateur d'analyseur syntaxique fait pour vous, vous aurez besoin d'un langage formel et de la théorie de l'analyse. Il y a des endroits pires pour commencer que le Dragon livre . Voir aussi:. Apprendre à écrire un compilateur

Si vous vous sentez courageux, assurez-vous de vérifier le lexing et le code distribué avec l'analyse syntaxique du compilateur DMD - / dmd2 / src / DMD / -. Lexer.c et parse.c

Autres conseils

Alors que Ragel est basée sur les expressions régulières, ce n'est pas juste un générateur de EFM regex. Il permet récursivité en utilisant une syntaxe d'appel / retour supplémentaire, ainsi que d'autres caractéristiques qui permettent l'analyse syntaxique des langues non régulières. Ainsi, alors que Ragel ne génère FSMs, elle permet de générer de multiples différents FSMs et fournit des mécanismes pour le saut entre eux en des points arbitraires, ou en utilisant une syntaxe spéciale de transition de la machine. Il permet également d'exécuter du code arbitraire à des transitions d'état.

Une autre chose qui rend Ragel unique est qu'il est en ligne. En d'autres termes, il est facile d'utiliser les données de numérisation à partir d'une source asynchrone, comme une prise de non-blocage. Il utilise également aucune ressource dynamique, sauf que pour l'appel / retour, vous pouvez utiliser soit statique, la mémoire automatique ou dynamique pour la pile; comme tu veux. Il n'y a pas état global, que ce soit.

Ragel est tout à fait unique. Contrairement à la plupart (tous?) Générateurs traditionnels, il a été fait pour la programmation du réseau.

Peut-être:

MySourceCode -> (Scanner) -> MyScannerDataFile MyScannerDataFile -> (Parser) -> MyParserDataFile MyParserDataFile -> (CodeGenerator) -> MyExecutableFile

ou

MySourceCode -> (ScannerAndParser) -> MyScannerAndParserDataFile MyScannerAndParserDataFile -> (CodeGenerator) -> MyExecutableFile

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top