BYACCJ: Как включить номер строки в мое сообщение об ошибке? - PullRequest
0 голосов
/ 09 апреля 2020

Это моя текущая функция обработки ошибок:

public void yyerror(String error) {
    System.err.println("Error: "+ error);
}

Это функция ошибок по умолчанию, которую я нашел на домашней странице BYACC / J . Я не могу найти способ добавить номер строки. Мой вопрос похож на этот вопрос . Но решение этого не работает здесь.

Для моего лексера я использую файл JFlex.

1 Ответ

1 голос
/ 10 апреля 2020

Это не сильно отличается от решения бизона / гибкого трубопровода, предложенного в вопросе, на который вы ссылаетесь. По крайней мере, принцип тот же. Различаются только детали.

Ключевым фактом является то, что именно сканер, а не анализатор, должен подсчитывать строки, поскольку именно сканер преобразует входной текст в токены. Парсер ничего не знает об исходном тексте; он просто получает последовательность красиво обработанных токенов.

Так что нам нужно изучить документацию для JFlex, чтобы выяснить, как заставить его отслеживать номера строк, а затем мы находим следующее в разделе опций и объявления:

  • %line

    Включает подсчет строк. Переменная типа int yyline содержит количество строк (начиная с 0) от начала ввода до начала текущего токена.

Руководство по 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 анализатор уже запросил токен предпросмотра, который может находиться на строка, следующая за ошибкой или даже отделенная от ошибки несколькими строками комментариев. (Эта проблема часто появляется, когда ошибка является пропущенным оператором-терминатором.) Но это хорошее начало.

...