Estoy creando un compilador con Lex y YACC (en realidad Flex y Bison). El lenguaje permite referencias directas ilimitadas a cualquier símbolo (como C#). El problema es que es imposible analizar el idioma sin saber qué es un identificador.¿Cómo implemento referencias directas en un compilador?
La única solución que conozco es leer toda la fuente, y luego hacer un análisis "ancho-primero", para que cosas de nivel superior como declaraciones de clase y declaraciones de funciones sean analizadas antes de las funciones que las usan. Sin embargo, esto requeriría una gran cantidad de memoria para archivos grandes, y sería difícil de manejar con YACC (tendría que crear gramáticas separadas para cada tipo de declaración/cuerpo). También tendría que escribir a mano el lexer (que no es un gran problema).
No me importa mucho la eficiencia (aunque sigue siendo importante), porque voy a reescribir el compilador en sí mismo una vez que lo termine, pero quiero que esa versión sea rápida (por lo tanto, si existe) son algunas técnicas generales rápidas que no se pueden hacer en Lex/YACC pero pueden hacerse a mano, por favor sugiérelas también). Entonces, en este momento, la facilidad de desarrollo es el factor más importante.
¿Hay alguna buena solución a este problema? ¿Cómo se hace esto generalmente en compiladores para lenguajes como C# o Java?
No tiene nada que ver con palabras clave. Es más como esto: es ABC (paquete AB). (Clase C), (paquete A). (Clase B). (Campo C), o (campo A). (Campo B). (Campo C), etc. – Zifre
Luego se aplica el segundo párrafo de mi respuesta. No necesita saber eso para analizar. Tratar ''. como un operador en tu gramática. En sus pases AST, puede verificarlos contra la tabla de símbolos. – U62
Bueno, supongo que tendré que hacer un árbol de análisis en lugar de un AST. Como dijiste, son diferentes. Si nadie viene con una mejor respuesta, lo aceptaré, pero preferiría no hacerlo de esta manera ... – Zifre