Учебное пособие по Antlr4 С#/Пример

Я хочу использовать Antlr4 для анализа некоторых файлов в моем приложении С#. Я смог генерировать файлы парсера и лексера до сих пор, учитывая мой грамматик. Теперь я хотел бы использовать чтение в файлах и применить к ним парсер и лексер. Я искал документацию о том, как это сделать, но я скоро приду. Я нашел несколько старых примеров, используя предыдущие версии Antlr, но они, похоже, не работают для Antlr4. Любая помощь будет оценена по достоинству. Спасибо.

Ответ 1

  • В Visual Studio откройте "Инструменты" → "Расширения и обновления" и выполните поиск в онлайн-разделе "Поддержка языка ANTLR" Сэма Харвелла. Более подробную информацию можно найти на сайте проекта GitHub
    • Это делает несколько вещей:
      • Добавляет шаблоны для комбинированных грамматик.
      • Добавляет выделение синтаксиса
      • Добавляет цель MSBuild для грамматики для генерации парсера.
  • В своем решении настройте структуру проекта следующим образом:
    • Решение
      • GrammarProject
        • Calculator.g4
      • ImplementationProject
        • GeneratedFiles (все файлы в этой папке добавляются как Ссылки на файлы, расположенные в GrammarProject\obj\Debug)
          • CalculatorBaseListener.cs
          • CalculatorBaseVisitor.cs
          • CalculatorLexer.cs
          • CalculatorListener.cs
          • CalculatorParser.cs
          • CalculatorVistor.cs
        • MyCalcualtorImplementation.cs
  • Напишите и скомпилируйте грамматику.
  • В папке "Ссылки на сгенерированные файлы" щелкните правой кнопкой мыши папку и нажмите "Добавить" - "Существующий элемент"
  • Обзор проекта Grammar\obj\Debug и выберите все созданные файлы парсера.
  • Этот следующий шаг важен. На кнопке "Добавить" есть небольшая стрелка раскрывающегося списка. Нажмите стрелку раскрывающегося списка и нажмите "Добавить как ссылку".
    • Это добавит сгенерированные файлы в проект реализации, используя символическую ссылку вместо прямой копии.
    • Это дает дополнительное преимущество в том, что вам не нужно удалять и повторно добавлять файлы парсера, если вам нужно позже поменять свою грамматику.
  • Как только вы достигли этого, вы можете наследовать от GrammarProject.CalculatorBaseListener или GrammarProject.CalculatorBaseParser в зависимости от того, какой шаблон разработки вы решили использовать.

В качестве побочного примечания, "The Definitive ANTLR 4 Reference" от Terence Parr - отличный ресурс для понимания того, как работает ANTLR4, и разницы шаблонов развития. Все примеры представлены в java, но концепции применимы как к Java, так и к С#.

Ответ 2

попробуйте

using (StreamReader fileStream = new StreamReader(fileName)) {
    AntlrInputStream inputStream = new AntlrInputStream(fileStream);

    SearchLexer lexer = new SearchLexer(inputStream);
    CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
    SearchParser parser = new SearchParser(commonTokenStream);

    parser.RemoveErrorListeners();
    parser.AddErrorListener(new ErrorListener()); // add ours

    parser.root();
}

Ответ 3

вот пример ErrorListener

public class ErrorListener : BaseErrorListener
{
    public void SyntaxError(IRecognizer recognizer, int offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        Console.WriteLine("{0}: line {1}/column {2} {3}", e, line, charPositionInLine, msg);
    }
}