Pregunta

Me han generado un antlr analizador de Java que utiliza el blanco C y funciona bastante bien. El problema es también lo quiero para analizar código erróneo y producir una significativa AST. Si alimento es una clase Java con un mínimo de una importación después de lo cual un punto y coma que falta se produce dos "Árbol de error de nodo" objetos en los que la "importación" de fichas y las fichas para la clase importada debe ser.

Sin embargo, ya que analiza el código siguiente correctamente y produce los nodos correctos para este código debe recuperarse del error añadiendo el punto y coma o la resincronización. ¿Hay una manera de hacer antlr reflejan esta entrada fija que produce internamente en el AST? O puedo al menos conseguir las fichas / texto que produjo los "Errores nodo del árbol" de alguna manera?

En los objetivos de C antlr3commontreeadaptor.c línea alrededor de 200 el siguiente fragmento indica que el objetivo C sólo crea nodos de error ficticios hasta el momento:

static  pANTLR3_BASE_TREE
errorNode                               (pANTLR3_BASE_TREE_ADAPTOR adaptor,   pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e)
{
    // Use the supplied common tree node stream to get another tree from the factory
    // TODO: Look at creating the erronode as in Java, but this is complicated by the
    // need to track and free the memory allocated to it, so for now, we just
    // want something in the tree that isn't a NULL pointer.
    //
    return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node");
}

Estoy de suerte aquí y sólo el error nodos de la meta de Java produce me permitiría recuperar el texto de los nodos erróneos?

¿Fue útil?

Solución 2

Me solucionó el problema mediante la adición de nuevas reglas alternativas a la gramática de todas las declaraciones erróneas posibles.

Cada declaración de importación de Java se traduce a un sub-árbol AST con la importación símbolo artificial como la raíz, por ejemplo. Para asegurarse de que puedo diferenciar entre los AST de código correcto y erróneo las reglas para las declaraciones erróneas ellos vuelven a escribir a un AST con un símbolo de raíz con el ERR_ prefijo, por lo que en el ejemplo de la declaración de importación, el símbolo de raíz artificial sería ERR_IMPORT.

Más diferentes símbolos de raíz se podrían utilizar para codificar la información más detallada sobre el error de análisis.

Mi analizador es ahora tan tolerante de error como lo necesito para ser y es muy fácil de añadir reglas para los nuevos tipos de entrada errónea cada vez que necesito para hacerlo. Usted tiene que tener cuidado de no introducir cualquier ambigüedad en su gramática, sin embargo.

Otros consejos

No he utilizado antlr mucho, pero por lo general la forma de manejar este tipo de error es añadir reglas de sintaxis de coincidencia mal, hacerlas producir nodos de error, y tratar de arreglar después de los errores para que pueda mantener el análisis. Arreglar después es el problema porque no desea que un error de desencadenar más y más errores para cada nuevo token hasta el final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top