2010-11-08 23 views
1

Je suis en train de concevoir un compilateur en C. Je veux savoir quelle technique je devrais utiliser, de haut en bas ou de bas en haut? J'ai seulement mis en application la priorité d'opérateur en utilisant bottom-up. J'ai appliqué les règles suivantes: Comment implémenter l'analyse?

E:=E+E 
E:=E-E 
E:=E/E 
E:=E*E 
E:=E^E 

Je veux savoir que je vais le tout de suite? Si je veux inclure if-else, boucles, tableaux, fonctions, ai-je besoin d'implémenter l'analyse syntaxique? Si oui, comment l'implémenter? Tout le monde peut J'ai seulement implémenté la collection de jetons et la priorité des opérateurs. Quelles sont les prochaines étapes?

+2

"Je veux savoir quelle technique utiliser, de haut en bas ou de bas en haut" Cela dépend de votre grammaire. Dans quelle langue implémentez-vous un compilateur? Est-ce que vous écrivez l'analyseur à partir de zéro, ou en utilisant un générateur d'analyseur (dans ce cas, cela déterminera l'approche)? –

+1

peut-être pas la meilleure question jamais, mais j'aime ce que j'ai appris en lisant les réponses – Andrey

+1

La question principale pour la technique générale de compilateur est [Apprendre à écrire un compilateur] (http://stackoverflow.com/q/1669/2509).Vous y trouverez de nombreuses ressources d'introduction. Vous pourriez regarder le tutoriel de Crenshaw. – dmckee

Répondre

1

La meilleure façon de mettre en œuvre un bon analyseur en C est d'utiliser flex & yacc

+3

Ou Lemon, qui est plus sain: http: //www.hwaci .com/sw/lemon/ –

+0

sans utiliser d'outils, pouvez-vous me dire comment l'implémenter –

+2

Vous avez besoin de lire des analyseurs syntaxiques, c'est un sujet beaucoup plus vaste que ce qui peut être couvert par une réponse SO. les références déjà données –

9

Lex & Yacc est votre réponse. Ou Flex et Bison qui sont des versions ramifiées d'outils originaux. Ils sont gratuits, ils sont le vrai standard pour écrire des lexers et des analyseurs en C et sont utilisés partout dans le monde.

En outre O'Reilly a publié une petite perle de 300 pages: Flex & Bison. Je l'ai acheté et il vous explique vraiment comment écrire un bon analyseur pour un langage de programmation et gérer toutes les choses subtiles (récupération d'erreur, conflits, étendues et ainsi de suite). Il répondra également à vos questions sur la façon dont vous analysez les expressions: votre approche est correcte avec un analyseur top-down mais vous découvrirez que cela ne suffit pas pour gérer les priorités des opérateurs.

Bien sûr, pour passe-temps, vous pouvez écrire votre propre lexer et parser, mais il serait juste un effort académique qui est agréable de comprendre le fonctionnement de EFM et analyseur, mais sans beaucoup de plaisir :)

Si vous sont, au contraire, intéressés par la conception de langage de programmation ou des implémentations complexes, je suggère ce livre: Programming Language Pragmatics qui n'est pas si célèbre en raison de la Dragon Book mais il explique vraiment pourquoi et comment diverses caractéristiques peuvent et doivent être mises en œuvre dans un compilateur. Le livre du dragon est aussi une bible, et il couvrira à un niveau bas réel comment écrire un analyseur .. mais ce serait ennuyeux, je vous préviens ..

+0

sans outillages, pouvez-vous me dire comment je l'implémente.je l'avais essayé de l'implémenter par yacc.But quand j'ai copiler le fichier y.tab.c, j'ai fait face à beaucoup d'erreurs. que dois-je faire? –

+2

parce que Yacc a besoin d'une connaissance de base de sa syntaxe avant d'être utilisé correctement.Le temps que vous perdez maintenant à comprendre sera sauvegardé plus tard quand vous écrivez des règles rapidement comme éclairage .. si vous allez écrire un analyseur à la main, préparez-vous pour passer beaucoup de temps .. – Jack

+0

@ Le conseil de Jack est le son. Je vous recommande également de bien comprendre LALR (1) analyse avant de mettre le doigt sur le clavier et la conception de grandes grammaires, sinon il est facile de tomber dans un certain nombre d'embûches (conflits) qui sont très difficiles à résoudre sans recommencer. – Flexo

1

Votre question est assez vague et difficile à répondre sans une question plus détaillée et détaillée. Le "Dragon book" est une excellente référence cependant pour quelqu'un qui cherche à implémenter un compilateur à partir de zéro, ou comme d'autres l'ont fait remarquer Lex et Yacc.

+6

Le livre du Dragon, bien qu'excellent, est également assez décourageant. Je ne le recommanderais pas comme première introduction aux compilateurs ... –

0

Si vous avez l'intention d'implémenter manuellement l'analyseur, vous devrez effectuer un analyseur syntaxique recursive descent. Le code reflète directement la grammaire, il est donc assez facile à comprendre et à comprendre. Il place des restrictions sur votre grammaire (vous ne pouvez pas avoir de non-terminal récursif à gauche), mais vous pouvez contourner ces problèmes.

Cependant, cela dépend de la complexité de la grammaire; le piratage à la main d'un analyseur pour quelque chose de beaucoup plus compliqué que les expressions arithmétiques de base devient très pénible très rapidement. Si vous essayez d'implémenter quelque chose qui ressemble à un vrai langage de programmation, utilisez un générateur d'analyseur comme yacc ou bison.

+0

Je veux implémenter l'analyse en utilisant la priorité de l'opérateur. Pouvez-vous m'aider? J'ai mis en place +, -, *,/............. Je veux savoir comment j'implémenterais le reste de la partie sans utiliser de grammaire à cause de mon projet d'université et de yacc, Bison n'est pas autorisé ici. –