Si usted tiene un modelo de la gramática en una forma normalizada (todas las reglas de este tipo):
LHS = RHS1 RHS2 ... RHSn ;
y el lenguaje prettyprinter (por ejemplo, AST a la herramienta de conversión de texto), se puede construir uno de estos bonitos fácilmente.
Simplemente comience con el símbolo de objetivo como árbol de unidades.
Repeat until no nonterminals are left:
Pick a nonterminal N in the tree;
Expand by adding children for the right hand side of any rule
whose left-hand side matches the nonterminal N
Para terminales que llevan valores (por ejemplo, nombres de variables, números, cadenas, ...) se tendrán que generar contenido aleatorio.
Una complicación con el algoritmo anterior es que no termina claramente. Lo que realmente quiere hacer es elegir un límite en el tamaño de su árbol, y ejecutar el algoritmo hasta que todos los no terminales se hayan ido o exceda el límite. En el último caso, retroceda, deshaga el último reemplazo y pruebe otra cosa. Esto le proporciona una búsqueda de profundidad limitada para un AST de su tamaño determinado.
Luego imprima el resultado. Es el prettyprinter part que es difícil de entender.
[Usted puede construir todo esto usted mismo, incluyendo la impresora bonita, pero es una buena cantidad de trabajo. Construyo herramientas que incluyen toda esta maquinaria directamente en una forma parametrizada por el lenguaje; ver mi biografía].
Un problema desagradable incluso con AST bien formados es que pueden ser absurdos; puede generar una declaración de un entero X y asignarle un valor literal de cadena para un idioma que no lo permita.Probablemente pueda eliminar algunos problemas simples, pero la semántica del lenguaje puede ser increíblemente compleja, considere C++ como ejemplo. Asegurar que termines con un programa semánticamente significativo es extremadamente difícil; en esencia, tiene que analizar el texto resultante y realizar el nombre y el tipo de resolución/verificación en él. Para C++, necesita una interfaz completa de C++.
Pero ... ¿por qué ?: p Supongo que podría: si sigue la especificación CFG, tiene la seguridad de que obtendrá un código C al menos sintácticamente válido. Pero no lo hago. Creo que alguien ha tratado de hacer tal cosa. Probablemente necesites escribir algún tipo de analizador inverso ... – Robert
He trabajado con algunos ... (esto es una broma; Amo a todos mis colegas). –
¿Hay alguna razón por la cual uno quisiera un código fuente aleatorio y sin sentido que (muy probablemente) no haría nada? –