durante el análisis, si me encuentro con un símbolo incluyen quiero instruir a YACC para abrir el archivo especificado como entrada y para comenzar a analizar esto. Una vez que este análisis finalice, quiero instruir a YACC que regrese al archivo y continúe el análisis directamente después de la expresión de inclusión. Restringiré el nivel de profundidad de inclusión a uno.¿Cómo puedo implementar #include constructs con Flex y YACC?
10
A
Respuesta
6
El manual flex cubre cómo hacer esto utilizando yypush_buffer_state() y yypop_buffer_state(). Here es la sección del manual sobre el uso de múltiples buffers de entrada. Hay un código de muestra.
4
Es normal para la comunicación entre las fases léxicas y sintácticas de su procesador.
Por lo tanto, reconozca la sintaxis de una directiva de inclusión en su analizador (o, para facilitar las cosas, simplemente identifíquela en el lector lex) y realice la conmutación en el nivel léxico. Por ejemplo, este es un lenguaje simple que reconoce las líneas de entrada estándar que contienen ab
o cd
o .file
Cuando ve .someString
abre someString
como un archivo de inclusión y luego vuelve a leer la entrada estándar.
%{
#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;
}
Y cuando lo ejecutamos ... respuesta
$ 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
$
Cuestiones relacionadas
- 1. Usos apropiados para yacc/byacc/bison y lex/flex
- 2. ¿Cuál es la diferencia entre Flex/Lex y Yacc/Bison?
- 3. Integración de Bison/Flex/Yacc en el código X
- 4. Gramática Lisp en yacc
- 5. Lex y Yacc en PHP
- 6. ¿Cómo puedo implementar MVVM con almacenamiento sin conexión y Knockout.js?
- 7. ¿Cómo puedo implementar directorios virtuales con node.js y express?
- 8. Lex/Yacc para C#?
- 9. ¿Cómo puedo implementar TinyMCE con Require.js?
- 10. ¿Hay un buen modo o método de Emacs para los archivos lex/flex/yacc/bison?
- 11. Dificultad común con Flex ++
- 12. Uso de Yacc y Lex en Xcode
- 13. ¿Cómo puedo "eliminar" un arrastre en Flex?
- 14. Haskell herramientas de análisis - yacc: lex :: feliz :?
- 15. yylval indefinido con flex y bison
- 16. Entity Framework - ¿Herencia con .Include?
- 17. ¿Hay algún Lex y Yacc IRC activo?
- 18. ¿C tiene puerto (directo) flex/yacc? ¿O qué personas lexer/analizador usan para C#?
- 19. cómo #include en javascript?
- 20. ¿Hay depuradores gramaticales Yacc?
- 21. ¿Puedo usar flex sin el generador de Flex?
- 22. ¿Una alternativa al dúo de flex y bisontes?
- 23. Yacc equivalente para Java
- 24. yacc/lex o codificación manual?
- 25. Flex - Problema con ResizeEvent.RESIZE
- 26. Flex y crossdomain.xml
- 27. Flex - URLLoader y HTTPService
- 28. ¿Cómo uso C++ en flex y bison?
- 29. ¿Cómo puedo ver el gráfico C/C++ #include fácilmente?
- 30. Recursos para implementar el patrón MVVM (ViewModel) en Flex?
DigitilRoss' fue exhaustiva, y lo suficientemente precisa. Pero las mejores prácticas triunfan sobre la astucia cualquier día. Vi esto hace 18 minutos y ahora tengo trabajo incluido. Gracias por el enlace. +1 – Jamie