2009-06-15 6 views
3

Je veux construire un lexer en C et je suis le dragon book, je peux comprendre les transitions d'états mais comment les implémenter?Construire un lexer en C

Y a-t-il un meilleur livre?

Le fait que je dois analyser une chaîne à travers un certain nombre d'états pour que je puisse dire si la chaîne est acceptable ou non!

+0

qui http: //en.wikipedia. org/wiki/Dragon_book? –

+0

Vous devez nous donner un peu plus pour continuer. Quel aspect de la mise en œuvre des transitions d'état trouvez-vous difficile? –

+1

Pourquoi n'utilisez-vous pas LEX? – qrdl

Répondre

3

G'day,

En supposant que vous voulez dire que le livre Dragon sur le compilateur conception, je recommande de jeter un oeil autour de this page sur les outils du compilateur.

La page elle-même est assez petite mais possède des liens vers d'excellentes ressources sur les analyseurs lexicaux.

HTH

acclamations,

6

Vous pouvez implémenter des transitions d'état simples avec une variable d'état unique, par exemple si vous voulez parcourir les états start-> part1-> part2-> end, vous pouvez utiliser une énumération pour garder une trace de l'état actuel et utilisez une instruction switch pour le code que vous voulez exécuter dans chaque état.

enum state { start=1, part1, part2, end} mystate; 

// ... 
mystate = start; 
do { 
    switch (mystate) { 
    case start: 
     // ... 
    case part1: 
     // ... 
    case part2: 
     // ... 
     if (part2_end_condition) mystate = end; // state++ will also work 
     // Note you could also set the state back to part1 on some condition here 
     // which creates a loop 
     break; 
    } 
} while (mystate != end); 

Pour les transitions d'état les plus complexes qui dépendent de plusieurs variables, vous devez utiliser des tables/tableaux comme celui-ci:

var1 var2 var_end next_state 
0  0  0   state1 
0  1  0   state2 
1  0  0   state3 
1  1  0   state4 
-1  -1  1   state_end // -1 represents "doesn't matter" here 
+0

sont différentes variables d'état et de mystère? –

+0

Désolé, c'était une faute de frappe. state est le nom du type enum, mysate est la seule variable utilisée ici. – schnaader

1

Si vous êtes à la recherche d'un traitement plus moderne que le livre de dragon (s): Andrew W. Appel et Maia Ginsburg, moderne Compiler Implementation in C, Cambridge University Press, 2008.

Le chapitre 2 est axé sur l'analyse lexicale: jetons lexicaux, expressions régulières, automates finis; Automates finis non déterministes; générateurs d'analyseur lexicaux

Regardez le Table of Contents

3

Il y a plus d'une façon de le faire. Chaque expression régulière correspond directement à un programme structuré simple. Par exemple, une expression pour le nombre pourrait être ceci:

// regular expression 
digit* [.digit*] 

et le code C correspondant serait:

// corresponding code 
while(DIGIT(*pc)) pc++; 
if (*pc=='.'){ 
    pc++; 
    while(DIGIT(*pc)) pc++; 
} 

La voie de transition table des lexers de construction est, à mon avis, inutilement compliqué, et évidemment court plus lentement.

+0

Une raison particulière pour laquelle vous utilisez * pc puis pc [0] puis * pc à nouveau? –

+0

@John. Fixé. Je suppose que c'est un reste accidentel du cas où je voulais exclure le cas d'un «seul». en regardant en avant. En d'autres termes, je devrais vraiment envelopper le tout dans if (DIGIT (pc [0]) || (pc [0] == '.' && DIGIT (pc [1]))) –

0

Le programme flex (un clone de lex) va créer un lexer pour vous. Étant donné un fichier d'entrée avec les règles lexer, il produira un fichier C avec une implémentation d'un lexeur pour ces règles.

Vous pouvez ainsi vérifier la sortie de flex pour savoir comment écrire un lexer en C. est, si vous ne voulez pas seulement d'utiliser le lexer Flex ...

+0

Aussi, Bison a une clause de non-responsabilité Cela dit que le code généré par Bison peut être utilisé dans un code non-GPL. –

+0

mis à jour (commentaires supprimés sur la GPL, mon mauvais, désolé). S'il vous plaît, n'appelez pas les gens stupides. C'était un peu offensé, mais seulement au début. Bison a eu des problèmes avec le code généré, heureux de voir qu'ils ont ajouté un avertissement. –

Questions connexes