La création d'un analyseur syntaxique pour un simple pseudo-code de langue?
Je voulais faire un simple analyseur, pour un "pseudo-code" comme le langage(gardé rigide), en Java.
Un exemple de pseudo-code serait -
//This is a comment
$x1 = readint
$x2 = readint
$dx = $x2 - $x1
#f = $dx / 2
if ($dx > 0)
{
loop while(#f > 1)
{
print(#f)
#f = #f / 2
}
}
Noter que le code ci-dessus est rigide, il ne peut pas être plus d'une instruction sur une ligne de nombres entiers, à commencer avec $, les chars commencent par un # etc.
Pour analyser un tel code, tout d'abord je peux utiliser StringTokenizer
, puis expression régulière, le match entier variables, float-variables, ou de mots clés.
Cette approche est-elle bonne? Pour les déclarations en boucle, comment puis-je stocker les expressions, de sorte que je n'ai pas à marquer à chaque itération?
Que je pouvais penser de convertir des expressions (comme #f = #f /2) pour polir la notation, puis à stocker dans la pile. Et à chaque itération, tout en sautant opérandes je pouvais remplacer la valeur pour chaque variable. Mais est-ce assez efficace?
Merci d'avance pour toute suggestion.
OriginalL'auteur Vinayak Garg | 2012-03-31
Vous devez vous connecter pour publier un commentaire.
Bien que je pense que c'est génial que vous voulez construire un analyseur syntaxique pour une langue comme ça, c'est beaucoup plus difficile qu'il n'y paraît. L'analyse est très bien étudié le problème et il ya beaucoup d'excellents algorithmes que vous pouvez utiliser, mais ils sont extrêmement difficiles à mettre en œuvre à la main. Alors que vous pouvez utiliser des astuces comme les conversions à la RPN pour les petits exemples comme celui de l'analyse des expressions, construction d'un langage de programmation nécessite un ensemble beaucoup plus complexe de tours.
D'analyser une langue de cette complexité, vous êtes probablement mieux à l'aide d'un analyseur générateur plutôt que d'essayer d'écrire votre propre main. ANTLR et Java de la COUPE du sont tous deux bien connus des outils pour faire précisément ce que vous êtes intéressé à accomplir, et je suggère fortement à l'aide de l'un des deux d'entre eux.
Espérons que cette aide!
Merci!!!! Je vais de ce pas regarder les deux d'entre eux, mais vous pouvez choisir l'un d'eux? 😛 vu que mon exemple de code, et que j'allais sortir mon code sous GPL, plus petite empreinte etc. Hehe, je serais certainement faire un parser, mais sans doute un autre jour.
Je n'ai pas beaucoup d'expérience non plus, mais ANTLR a une large communauté de base. Il pourrait être intéressant d'étudier.
+1 pour toutes les réponses grands. Je vais aller pour ANTLR.
OriginalL'auteur templatetypedef
Simple pour les langues (ce qui est un jugement d'appel, et si vous êtes inexpérimenté, vous ne pouvez pas être en mesure de faire cet appel correctement), on peut écrire une descente récursive de l'analyseur à la main qui fait bien assez. La bonne nouvelle est que l'encodage d'une descente récursive de l'analyseur est assez simple.
Si vous n'êtes pas sûr, utilisez overkill dans la forme de la plus forte analyseur générateur que vous pouvez obtenir.
OriginalL'auteur Ira Baxter
dans les cas simples écrit manuellement un analyseur de sens.
Cependant, l'utilisation de StringTokenizer est un indicateur de faire mal, car un StringTokenizer EST déjà un SIMPLE analyseur.
un analyseur lit habituellement un char et des changements d'état en fonction de la valeur de ce char.
Juste un simple analyseur, un "b" font suite à char "majuscules", e pour en minuscules. "." arrête de
l'incrémentation de 'pos' est manquant avant la fin de la boucle while 🙂
OriginalL'auteur stefan bachert