Это не сильно отличается от решения бизона / гибкого трубопровода, предложенного в вопросе, на который вы ссылаетесь. По крайней мере, принцип тот же. Различаются только детали.
Ключевым фактом является то, что именно сканер, а не анализатор, должен подсчитывать строки, поскольку именно сканер преобразует входной текст в токены. Парсер ничего не знает об исходном тексте; он просто получает последовательность красиво обработанных токенов.
Так что нам нужно изучить документацию для JFlex, чтобы выяснить, как заставить его отслеживать номера строк, а затем мы находим следующее в разделе опций и объявления:
Руководство по JFlex не ' Не говоря уже о том, что yyline
является закрытой переменной-членом, поэтому, чтобы получить ее от анализатора, вам нужно добавить в файл JFlex что-то вроде следующего:
%line
{
public int GetLine() { return yyline + 1; }
// ...
}
Затем вы можете добавить вызов GetLine
в функции ошибки:
public void yyerror (String error) {
System.err.println ("Error at line " + lexer.GetLine() + ": " + error);
}
Это иногда приводит к ошибочным сообщениям об ошибках, потому что к моменту вызова yyerror
анализатор уже запросил токен предпросмотра, который может находиться на строка, следующая за ошибкой или даже отделенная от ошибки несколькими строками комментариев. (Эта проблема часто появляется, когда ошибка является пропущенным оператором-терминатором.) Но это хорошее начало.