Ejemplo 01: el recorrido completo de la biblioteca, con un analizador
=====================================================================

Que es
------

Dos piezas que vienen de lugares distintos:

  main.c    759 lineas que usan casi toda la API: tablas, celdas, lineas,
            vistas, secuencias, encabezados, interpolacion y gnuplot. Al
            final, en la linea 448, llama a yyparse().

  calc.y    la gramatica (bison) y el analizador de palabras (flex) que
  flex.l    implementan ese yyparse(). No son un accesorio: sus reglas van
            llamando a create_table(), create_cell_u() y create_line() a
            medida que reconocen tokens. O sea que hacen el trabajo de
            manual_lexer.c, pero con una gramatica en vez del bucle de
            caracteres escrito a mano.

De donde vienen
---------------

calc.y y flex.l estaban en ../flex, un banco de pruebas de abril de
2024 donde se compararon tres formas de leer una tabla:

  flex.l + calc.y   gramatica con flex y bison        <- esto
  lexeralt.c        un lexer escrito a mano, 55 KB
  pcre2demo.c       expresiones regulares con PCRE2

Gano el escrito a mano, y de ahi salio src/manual_lexer.c, que es el que
carga las tablas hoy. Al lado hay svn/siru/reflex, el mismo experimento con
la biblioteca RE/flex; sigue en svn/siru/reflex.

Los dos archivos llegaron aca con svn move (tabular2 r1379), asi que su
historia viaja con ellos. En ../flex quedo lo demas: lexeralt.c,
pcre2demo.c, otrostextos.c y una copia entera de la biblioteca de antes de
tabular 2 --table.c de 31 KB contra los 42 de hoy, sin create_search_table,
free_tablelist ni get_table_info-- que estaba ahi para que el experimento
compilara.

Contra que compila
------------------

Contra el arbol de fuentes de tabular 2, no contra aquella copia vieja ni
contra la biblioteca instalada. Comprobado de dos maneras:

  - las dependencias reales que informa el compilador son ../../src/table.h,
    ../../src/cell.h y ../../src/interpola.h;

  - el binario contiene create_search_table, free_tablelist, get_table_info,
    get_view_info, verificar_abscisas y busca_encabezado, que existen solo en
    tabular 2 y algunas desde este ano.

En este directorio no hay ninguna fuente de la biblioteca: main.c, calc.y,
flex.l y los dos generados.

Que hubo que arreglar para que compilara
----------------------------------------

Dos cosas en flex.l, las dos anotadas en el lugar. Ninguna se habia visto
nunca, y no porque nadie lo compilara: el Makefile de ../flex tenia como
primer objetivo, el de por defecto, un lexer1 que si genera flex.yy.c y
calc.tab.c. Lo que pasa es que lexer1 no se construye desde antes de 2021: le
falta view.c, que la regla pide como view.o, y table.c no compila --linea 739,
"expected ';' before 'if'"--. O sea que nunca se llego a compilar el .c
generado a partir de flex.l.

  1. Una copia de quees() que chocaba con la de la biblioteca: "definiciones
     multiples" al enlazar. Ademas se habia quedado atras, llamaba a
     datetime() con cuatro argumentos cuando hoy lleva cinco. Se saco; calc.y
     la declara con la misma firma que la de manual_lexer.c y usa esa.

  2. Un "};" suelto despues del segundo %%. Todo lo que va ahi se copia tal
     cual al .c generado, asi que era un error de sintaxis.

Lo que no se sabe
-----------------

Que entrada espera. El analizador no lee un archivo de tabla comun: define un
lenguaje propio, con \table(nombre) para abrir una tabla, \include(archivo)
para traer otro y \tt(...). Se probaron una tabla normal, una tabla con
\table(mitabla) adelante y data/flexexample102.txt, que parece hecho para
esto; las tres terminan en

    syntax error, unexpected end of file, expecting NEWTABLE

Averiguarlo es leerse la gramatica entera. Por eso el ejemplo compila pero no
entra en "make prueba".

Y una advertencia: que compile no quiere decir que se comporte bien. La
gramatica se escribio contra la API anterior. Compilo sin tocarla porque las
tres funciones que llama --create_table, create_cell_u, create_line--
conservan la misma firma, pero eso no se probo corriendo.

Para que sirve entonces
-----------------------

Para mirarlo, no para usarlo. Lo que de verdad quedo de aquel experimento no
es el codigo sino la lista de lo que su formato entendia y el de hoy no:
comentarios /* */ de varias lineas, // como comentario, punto y coma como fin
de linea, barra invertida para continuar una linea, \include(archivo) y
comandos \nombre(...). Esa lista, con lo que costaria traer cada cosa a
manual_lexer.c, esta en el HACKING de tabular 2.

Quien quiera ver la biblioteca en uso tiene ../02, que compila, corre y hace
algo claro: interpola la salida de una simulacion de Simusol.

Como se compila
---------------

    export PKG_CONFIG_PATH=$HOME/svn/siru/local/lib/pkgconfig   # si hace falta
    make

Necesita flex y bison. Las banderas salen de ../comun.mk, que es el que
apunta al arbol de fuentes.
