2009-02-12 2 views
18

На самом деле, возможно, не полномасштабный Lex/Yacc. Я использую интерфейс командной строки для администрирования webapp. Я ищу что-то, что возьмет определение грамматики и превратит его в парсер, который напрямую вызывает методы на моем объекте. Подобно тому, как ASP.NET MVC может определить, какой метод контроллера вызывать, и как рассчитать аргументы.Lex/Yacc для C#?

Таким образом, если пользователь «создать Foo» в моей командной строке, он должен прозрачно вызывать метод:

private void Create(string id) { /* ... */ } 

О, и если он может генерировать текст справки из (например) атрибутов на тех, контроллеры, это тоже было бы потрясающе.

ответ

11

Я не уверен, что Lex/Yacc окажет любую помощь. Вам просто нужен базовый токенизатор и интерпретатор, которые быстрее писать вручную. Если вы все еще разбираетесь в разборе, см. Irony.

В качестве опоры: считаете ли вы PowerShell и его командами?

+0

В то время как основные токенизеры довольно просты в написании - я делал несколько лет, они все еще не свободны, если кто-то уже сделал работу. Кроме того, да, я рассмотрел PowerShell. Я недостаточно знаком с этим, чтобы решить, хорошо ли это или нет. –

+0

См. Http://msdn.microsoft.com/en-us/library/ms714622.aspx для получения информации о командлетах. –

+0

Было бы неплохо иметь C++ CLI lex/yacc – Dmitry

5

Еще рано CTP поэтому не могут быть использованы в производстве приложений, но вы можете быть заинтересованы в Осло/MGrammar: http://msdn.microsoft.com/en-us/oslo/

+2

Если кто-то задается вопросом, он мертв: http://en.wikipedia.org/wiki/Oslo_(Microsoft) & http://en.wikipedia.org/wiki/M_(programming_language) – Athari

+1

Элвис тоже мертв ... – KristoferA

3

Если вы не боитесь альфа программного обеспечения и хотите альтернативу Lex/Yacc для создания собственных языков, вы можете посмотреть в Oslo. Я бы рекомендовал вам сесть за сеанс сессий TL27 и TL31 от last years PDC. TL31 непосредственно обращается к созданию определенных доменных языков с использованием Осло.

3

Coco/R - генератор компилятора с реализацией .NET. Вы можете попробовать это, но я не уверен, что получение такой библиотеки для работы будет быстрее, чем создание собственного токенизатора.

http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/

3

Я хотел бы предложить csflex - C# порт прогибается - самый известный генератор сканера Unix.

3

Я считаю, что lex/yacc уже находятся в одном из SDK (т. Е. RTM). Либо Windows или .NET Framework SDK.

+2

Microsoft Visual Studio 2008 SDK имеет MPLex и MPPG в VisualStudioIntegration \ Tools \ Bin –

8

Также смотрите на Antlr, который имеет поддержку C#.

14

Я сделал несколько небольших проектов с GPLEX/GPPG, которые представляют собой довольно простые повторные реализации LEX/YACC в C#. Я не использовал ни один из других инструментов выше, поэтому я не могу их сравнить, но они отлично работали.

GPPG можно найти here и GPLEX here.

Это, я согласен, полное решение LEX/YACC, вероятно, слишком велико для вашей проблемы. Я бы предложил создать набор привязок с помощью IronPython: он легко взаимодействует с .NET-кодом, не-программисты, похоже, считают, что базовый синтаксис достаточно полезен, и он дает вам много гибкости/мощности, если вы решите его использовать.

+3

Как и в виде панировки, GPPG теперь можно найти по адресу http://gppg.codeplex.com/, а GPLEX - http://gplex.codeplex.com/ – Bklyn

3

Gardens Point Parser Generator here обеспечивает функциональность Yacc/Bison для C#. Он может быть загружен here. Полезный пример использования GPPG обеспечивается here

+0

На данный момент это багги - он переводит 'noassoc' в' right' (так что вкратце он принимает ввод, который должен быть неправильным в соответствии с грамматикой). – greenoldman

1

Просто для записи, реализация лексический и LALR парсер в C# для C#:

http://code.google.com/p/naive-language-tools/

Это должно быть похоже на пользование Lex/Yacc, однако те, инструменты (NLT) не являются генераторами! Таким образом, забудьте о скорости.

4

В последнее время у Джисона очень много тяги. Это порт Bison для javascript. Из-за этого очень простой характер, я портировал шаблон jing parsing/lexing в php, а теперь и на C#. Это все еще очень нова, но если у вас есть шанс, взгляните на это здесь: https://github.com/robertleeplummerjr/jison/tree/master/ports/csharp/Jison