Вопрос
На самом деле, возможно, это не полноценный Лекс/Якк.Я реализую интерфейс интерпретатора команд для администрирования веб-приложения.Я ищу что-то, что возьмет определение грамматики и превратит его в синтаксический анализатор, который напрямую вызывает методы моего объекта.Подобно тому, как ASP.NET MVC может определить, какой метод контроллера вызывать и как распределить аргументы.
Итак, если пользователь вводит «создать foo» в моей командной строке, он должен прозрачно вызвать метод:
private void Create(string id) { /* ... */ }
Да, и если бы он мог генерировать текст справки из (например) атрибутов этих методов контроллера, это тоже было бы здорово.
Решение
Я не уверен, что Lex/Yacc сможет чем-то помочь.Вам просто понадобится базовый токенизатор и интерпретатор, которые быстрее написать вручную.Если вы все еще занимаетесь анализом маршрута, см. Ирония.
В качестве примечания:рассматривали ли вы PowerShell и его командлеты?
Другие советы
Я выполнил пару небольших проектов с GPLEX/GPPG, которые представляют собой довольно простую реализацию LEX/YACC на C#.Я не использовал другие инструменты, описанные выше, поэтому не могу их сравнивать, но они работали нормально.
GPPG можно найти здесь и ГПЛЕКС здесь.
При этом я согласен, что полное решение LEX/YACC, вероятно, является излишним для вашей проблемы.Я бы предложил создать набор привязок с помощью IronPython:он легко взаимодействует с кодом .NET, непрограммисты, похоже, находят базовый синтаксис вполне пригодным для использования, и он дает вам большую гибкость и мощь, если вы решите его использовать.
Также посмотрите Антлр, который имеет поддержку C#.
CTP все еще ранний, поэтому его нельзя использовать в рабочих приложениях, но вас может заинтересовать Oslo/MGrammar:http://msdn.microsoft.com/en-us/oslo/
В последнее время Джисон набирает большую популярность.Это порт Bison на JavaScript.Из-за его чрезвычайной простоты я портировал шаблон синтаксического анализа/лексирования jison на php, а теперь и на C#.Он все еще очень новый, но если у вас будет возможность, взгляните на него здесь: https://github.com/robertleeplummerjr/jison/tree/master/ports/csharp/Jison
Если вы не боитесь альфа-версии программного обеспечения и хотите альтернативу Lex/Yacc для создания собственных языков, вы можете рассмотреть Осло.Я бы порекомендовал вам просмотреть записи сессий TL27 и TL31 от PDC прошлых лет.TL31 напрямую касается создания предметно-ориентированных языков с использованием Осло.
Coco/R — это генератор компилятора с реализацией .NET.Вы могли бы попробовать это, но я не уверен, что заставить такую библиотеку работать будет быстрее, чем написать собственный токенизатор.
Я бы предложил csflex - C#-порт flex - самого известного генератора сканеров Unix.
Я считаю, что lex/yacc уже есть в одном из SDK (т.РТМ).Либо Windows, либо .NET Framework SDK.
Как сказал Антон, PowerShell, вероятно, лучший вариант.Если вам нужна реализация lex/yacc, тогда Малькольм Кроу имеет хороший набор.
Редактировать: Прямая ссылка на инструменты компилятора
Для справки: реализация лексера и парсера LALR на C# для C#:
http://code.google.com/p/naive-language-tools/
По использованию он должен быть аналогичен Lex/Yacc, однако эти инструменты (NLT) не являются генераторами!Таким образом, забудьте о скорости.