Я хочу использовать Antlr4 для анализа некоторых файлов в моем приложении С#. Я смог генерировать файлы парсера и лексера до сих пор, учитывая мой грамматик. Теперь я хотел бы использовать чтение в файлах и применить к ним парсер и лексер. Я искал документацию о том, как это сделать, но я скоро приду. Я нашел несколько старых примеров, используя предыдущие версии Antlr, но они, похоже, не работают для Antlr4. Любая помощь будет оценена по достоинству. Спасибо.
Учебное пособие по 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
- GeneratedFiles (все файлы в этой папке добавляются как Ссылки на файлы, расположенные в GrammarProject\obj\Debug)
- GrammarProject
- Решение
- Напишите и скомпилируйте грамматику.
- В папке "Ссылки на сгенерированные файлы" щелкните правой кнопкой мыши папку и нажмите "Добавить" - "Существующий элемент"
- Обзор проекта 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);
}
}