Lors de l'analyse, si je rencontre un jeton d'inclusion, je souhaite que YACC ouvre le fichier spécifié comme entrée et commence à l'analyser. Une fois cette analyse terminée, je souhaite que YACC retourne au fichier et continue l'analyse directement après l'expression include. Je vais restreindre le niveau de profondeur d'inclusion à un.Comment puis-je implémenter des constructions #include avec Flex et YACC?
Répondre
Le manuel flexible explique comment procéder en utilisant yypush_buffer_state() et yypop_buffer_state(). Here est la section du manuel sur l'utilisation de plusieurs tampons d'entrée. Il y a un exemple de code.
Il est normal de communiquer entre les phases lexicale et syntaxique de votre processeur. Donc, reconnaissez la syntaxe d'une directive include dans votre analyseur (ou, pour simplifier les choses, reconnaissez-la simplement dans le lexeur) et faites la commutation au niveau lexical. Par exemple, voici un langage simple reconnaissant les lignes d'entrée standard contenant ab
ou cd
ou .file
. Lorsqu'il voit .someString
, il ouvre someString
en tant que fichier d'inclusion, puis revient à la lecture de l'entrée standard.
%{
#include <stdio.h>
#include <stdlib.h>
void start_include(char *); int yylex(void); void yyerror(void *);
#define YYSTYPE char *
%}
%%
all: all others | others;
others: include_rule | rule_1 | rule_2 | 'Z' { YYACCEPT; };
include_rule: '.' '\n' { start_include($1); };
rule_1: 'a' 'b' '\n' { printf("random rule 1\n"); };
rule_2: 'c' 'd' '\n' { printf("random rule 2\n"); };
%%
FILE * f = NULL;
void start_include(char *s) {
if ((f = fopen(s, "r")) == NULL)
abort();
}
int yylex(void) {
int c;
static char s[100];
if (f == NULL)
f = stdin;
c = getc(f);
if (c == EOF) {
f = stdin;
c = getc(f);
}
if (c == '.') {
scanf(" %s", s);
yylval = s;
} else if (c == EOF)
return 'Z';
return c;
}
Et quand nous courons ...
$ cat > toplevel
ab
.myinclude
ab
$ cat > myinclude
cd
cd
$ yacc ip.y && cc -Wall y.tab.c -ly && ./a.out < toplevel
random rule 1
random rule 2
random rule 2
random rule 1
$
- 1. Include struct dans le% union def avec Bison/Yacc
- 2. Erreur Handing avec Flex (LEX) et Bison (yacc)
- 3. Comment travailler avec des constructions dans PHPUnit?
- 4. Provisionnement des profils et des constructions xcode
- 5. Comment utiliser yylval avec des chaînes dans yacc
- 6. Confusion d'inclusion Yacc et Lex
- 7. Pourquoi ai-je une erreur de syntaxe dans mon programme fait avec flex et yacc?
- 8. Constructions automatisées et STDIN
- 9. Quelle est la différence entre Flex/Lex et Yacc/Bison?
- 10. Comment retourner les littéraux de flex à yacc?
- 11. Création d'un mot-clé foreach avec yacc ou Bison et Flex
- 12. défaut de segmentation avec bison et flex
- 13. Comment implémenter des macros dans Flex/FlashDevelop/AS3
- 14. déclaration des variables globales dans yacc
- 15. Comment implémenter glisser et déposer dans le contrôle Flex Grid?
- 16. Equivalent Java des constructions .NET
- 17. Structure de projet recommandée pour les constructions Flex
- 18. Lisp grammar in yacc
- 19. comment installer Lex et Yacc dans Ubuntu?
- 20. veut des icônes différentes avec des constructions différentes en C#
- 21. Comment implémenter cette disposition dans Flex 4?
- 22. Implémentation des fonctions include/sched.h
- 23. lex/yacc et parser/scanner
- 24. shift/reduce conflicts yacc
- 25. Comment implémenter des plateformes mobiles avec Cocos2d, TMXTiledMaps et Chipmunk
- 26. Comment implémenter PriorityBlockingQueue avec ThreadPoolExecutor et des tâches personnalisées
- 27. JSP include avec l'utilisation des paramètres
- 28. chargement Désireuse avec Include()
- 29. Toute personne connaissant des constructions lentes avec VS2010?
- 30. Sécurité PHP avec include
DigitilRoss de réponse était complète et assez précis. Mais les meilleures pratiques l'emportent sur l'intelligence chaque jour. J'ai vu ça il y a 18 minutes et maintenant j'ai travaillé. Merci pour le lien. +1 – Jamie