2010-11-24 37 views
2

J'ai généré avec flex un lexer.Comment écrire son propre analyseur pour (f) lex?

[ \t\n\r\v]   /* skip whitespace */ 

[_a-zA-Z]([_a-zA-Z]|[0-9])* printf("IDENT\n"); 
[0-9]+  printf("INTEGER\n"); 
[0-9]+\.  printf("DOUBLE\n"); 

Maintenant, je veux écrire mon propre analyseur en C, mais je ne sais pas comment je reçois les jetons de la lexer. Dois-je inclure "lexer.c" un appel yylex()? Ensuite, je dois retourner les types enum au lieu d'appeler printf(). Quelle est la meilleure façon de le faire sans utiliser bison/yacc?

+0

N'y a-t-il pas vraiment de documentation GNU gratuite pour les versions GNU de ces outils? Je suis sûr qu'il y a aussi un livre O'Reilly, qui a probablement une version en ligne. (Je poste ceci comme un commentaire plutôt qu'une réponse parce que je n'ai pas de références tout de suite, mais j'ai l'impression de me souvenir les avoir vues ..) –

Répondre

1

Vous devrez développer cette grammaire avant d'avoir fini, mais ...

  • Oui, vous remplacerez les printf() déclarations avec return appropriées déclarations
  • (Ou, plus probable/mieux, garder les instructions d'impression et ajouter des déclarations de retour).
  • Vous regrouperez les actions dans les accolades '{ ... }'.
  • Vous devrez réfléchir à la manière dont vous allez communiquer le type de jeton et la valeur du jeton à votre analyseur.

La méthode standard consiste à renvoyer le type de jeton de yylex() - la fonction générée par Flex. Il existe une variable globale, ylval, qui peut être utilisée pour transmettre la valeur du jeton. Vous pouvez contrôler son type. Notez que quelque part sur le chemin, vous devrez spécifier les numéros de jetons (types de jetons). Cela peut être une énumération ou une série de #defines. Classiquement, les informations sont fournies à l'analyseur lexical par l'analyseur. C'est-à-dire, Yacc fournit une liste des nombres de jeton qu'il compte utiliser, et le Flex utilise ces nombres (ou, plus exactement, vous utilisez ces nombres dans les déclarations de retour dans le code généré par Flex).

Pour obtenir les jetons de la lexeur à votre analyseur, vous devez appeler yylex(); vous compilez généralement cela séparément de votre analyseur, bien que vous puissiez probablement inclure sa source générée dans votre fichier analyseur si vous le souhaitez vraiment.