Open aurusov opened 8 years ago
Если задача тянет на бонус, практику или курсовой, то сформулируй постановку и набросай путь решения.
Пути решения сразу не вижу, надо разбираться.
Проблема решается созданием своего класса, наследующего SyntaxErrorMessageProvider
и переопределением его метода getSyntaxErrorMessage()
. В этом методе можно посмотреть контекст грамматической ошибки (на каком элементе грамматики она случилась) и дефолтное сообщение об ошибке, ну и вернуть свое сообщение об ошибке вместо дефолтного.
Вполне тянет на бонус или практику.
Могу написать чуть более подробную инструкцию, если нужно.
Пример в коде есть ?
Вечером скину.
Примерно так будет выглядеть нужный нам класс:
package ru.bmstu.rk9.rao.parser;
import static org.eclipse.xtext.diagnostics.Diagnostic.SYNTAX_DIAGNOSTIC;
import org.eclipse.xtext.nodemodel.SyntaxErrorMessage;
import org.eclipse.xtext.parser.antlr.SyntaxErrorMessageProvider;
import ru.bmstu.rk9.rao.rao.Logic;
public class RaoSyntaxErrorMessageProvider extends SyntaxErrorMessageProvider {
@Override
public SyntaxErrorMessage getSyntaxErrorMessage(IParserErrorContext context) {
if (context.getCurrentContext() instanceof Logic) {
return new SyntaxErrorMessage("This is the custom error message", SYNTAX_DIAGNOSTIC);
}
return super.getSyntaxErrorMessage(context);
}
}
В RaoRuntimeModule
надо его забиндить:
public Class<? extends ISyntaxErrorMessageProvider> bindISyntaxErrorMessageProvider() {
return RaoSyntaxErrorMessageProvider.class;
}
Как правильно работать с контекстом ? Можешь сделать пример для ошибки из топика ?
Пока не могу, не разбирался достаточно подробно. Сделать?
UPD: Немного покопался с контекстами, они странные. По непонятным для меня причинам в невалидном коде, который вы привели, он находит FunctionDeclaration
. Не уверен, что, если икстест выдает такой мусор, то его можно адекватно обработать.
Что делать ?
Ну, в лучше случае можно показать чуть более адекватное сообщение об ошибке в одном месте (где подчеркивается new) и оставить непонятный мусор в остальных местах.
Это не решение. В Старом РДО я убил 1 год, чтобы сделать хоть какие-то сообщения об ошибках, которые и в финальной версии выглядели не очень. И для этого нужно было править грамматику, она выросла в несколько раз. Она писалась без оглядки на ошибки. Кажется, тут такой же случай. Поэтому прошу подумать над более сложным, но правильным решением. Не знаю true way для xbase'а. Решение главное наметить. Потом можно поставить как курсовой.
Нечитаемое сообщение об ошибке, пример для кода