Я никогда раньше не работал над Bison или Wisent.
с чего начать?
Моя настоящая цель - создать рабочую грамматику Wisent / Semantic для C #, чтобы можно было редактировать C # в emacs с автозавершением кода и всем остальным CEDET вкусности. (Для тех, кто не знает, Wisent - это порт на emacs-lisp для GNU Bison, который включен в CEDET. The Wisent, по всей видимости, является европейским бизоном. А бизон, насколько я понимаю, представляет собой игру слов, заимствованную из YACC. А CEDET - это набор инструментов разработки Emacs. Все поняли? Я не буду пытаться определять emacs.)
Microsoft предоставляет грамматику BNF для C #, включая все расширения LINQ, в справочный документ по языку. Мне удалось перевести это в файл .wy, который успешно компилируется с semantic-grammar-create-package
.
Но скомпилированная грамматика не «работает». В некоторых случаях грамматика «находит» enum
объявления, но не class
объявления. Почему? Я не знаю. Мне не удалось заставить его распознавать атрибуты. Я не считаю "отладку" грамматики очень простой.
Я подумал, что сделаю шаг назад и попытаюсь создать мудрую грамматику для гораздо более простого языка, игрушечного языка всего с несколькими ключевыми словами. Просто чтобы набраться опыта. Даже это оказывается проблемой.
Я видел документы .info по грамматике fw и wisent, но ... все же эти вещи не совсем проясняют для меня, как это работает на самом деле.
So
Q1: какие-нибудь советы по отладке грамматики Wisent в emacs? Есть ли способ запустить "похожий на ворс" элемент грамматики, чтобы узнать, есть ли неиспользуемые правила и подобные тупики? А как насчет возможности наблюдать за работой парсера? Что-нибудь в этом роде?
Q2. Какие-нибудь советы по освоению зубров и зубров в целом? Я думаю, что это инструмент, который позволит мне получить некоторое представление о том, как работают правила. Что-то, что обеспечивает некоторую прозрачность, вместо того, чтобы испытывать «это не сработало», которое я получаю сейчас с Wisent.
Q3. Следует ли мне сдаться и стать органическим фермером, вместо того чтобы продолжать бороться с этим?
ps: Я знаю о существующей грамматике C # в каталоге contrib файла CEDET / semantic. Эта штука работает, но ... Она не поддерживает последнюю спецификацию C #, включая LINQ, частичные классы и методы, yield, анонимные методы, инициализаторы объектов и так далее. Также он в основном занимается парсингом кучи кода C #. Он вынюхивает классы и методы, а затем выходит из строя. Даже циклы foreach выполняются не совсем правильно. В общем, это хорошо, но я бы хотел, чтобы он стал лучше. Я пытаюсь сделать его актуальным, а также расширить его для синтаксического анализа кода C #.