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