Informo cómo implementar la indentación como delimitadores de bloque en bison + flex. Al igual que en Python. Estoy escribiendo mi propio lenguaje de programación (sobre todo por diversión, pero tengo la intención de usarlo junto con un motor de juego), intentaré encontrar algo especial que minimice los estándares y maximice la velocidad de desarrollo.Cómo utilizar la sangría como delimitadores de bloque con bison y flex
Ya he escrito un compilador (en realidad, un `langToy ' para el traductor de Nasm) en C, pero falló. Por alguna razón, solo fue capaz de manejar una cadena en todo el archivo fuente (bueno, había estado despierto durante más de 48 horas, así que ... Ya sabes, la crisis cerebral).
No sé si las llaves y/o el comienzo -> fin son más fáciles de implementar (no tengo problemas para hacer eso) o si es solo mi cerebro el que se traba.
¡Gracias de antemano!
Actualización: Está bien, no tengo ni idea de cómo hacerlo con la flexión. Tengo problemas para devolver varios DEDENTES al analizador. Flex/Bison son relativamente nuevos para mí.
Actualización 2: Este es el flex-archivo que he encontrado hasta el momento; no acaba de conseguirlo:
%x t
%option noyywrap
%{
int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}
%%
<*>\n { ntab = 0; BEGIN(t); }
<t>\t { ++ntab; }
<t>. { int i; /* my compiler complains not c99 if i use for(int i=0... */
if(ntab > ltab)
printf("> indent >\n");
else if(ntab < ltab)
for(i = 0; i < ltab - ntab; i++)
printf("< dedent <\n");
else
printf("= =\n");
ltab = ntab; ntab = 0;
BEGIN(INITIAL);
/* move to next rule */
REJECT;}
. /* ignore everything else for now */
%%
main()
{
yyin = fopen("test", "r");
yylex();
}
Puede tratar de jugar un rato con él, tal vez usted ve lo que me falta. devolver dedents múltiples sería una facilidad en haXe (return t_dedent (num);).
Este código no siempre coincide con las sangrías/dedents correctamente.
Actualización 3: creo que voy a perder la esperanza de flexión y hacerlo a mi manera, Si alguien sabe cómo hacerlo en flexión que estaría feliz de escuchar que de todos modos.
Parece que lo tienes, pero quiero que las pestañas cuenten como 2 espacios. Así que supongo que la línea debe ser current_line_indent = (current_line_indent + 2) & ~1; – Frank
Sí, cuando ve una pestaña, necesita colocar current_line_indent en la siguiente tabla de pestañas. –