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