У меня есть сгенерированный antlr анализатор Java, использующий цель C, и он работает довольно хорошо. Проблема в том, что я также хочу, чтобы он анализировал ошибочный код и создавал значимый AST. Если я передаю ему минимальный Java-класс с одним импортом, после которого точка с запятой отсутствует, он создает два объекта «Tree Error Node», в которых токен import и токены импортируемого класса должны быть.
Но так как он правильно анализирует следующий код и создает правильные узлы для этого кода, он должен восстановиться после ошибки путем добавления точки с запятой или повторной синхронизации. Есть ли способ заставить antlr отражать этот фиксированный ввод, который он вырабатывает внутри AST? Или я могу хотя бы получить токены / текст, которые как-то породили «Ошибки узлов дерева»?
В целях C
antlr3commontreeadaptor.c около строки 200 следующий фрагмент указывает, что цель C пока создает только фиктивные узлы ошибок:
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");
}
Мне здесь не повезло, и только те узлы ошибок, которые выдает цель Java, позволили бы мне получить текст ошибочных узлов?