Предложения по созданию настраиваемого парсера - PullRequest
1 голос
/ 24 октября 2008

Я хочу создать парсер для языка, подобного Си. Интересный аспект этого заключается в том, что я хочу построить его таким образом, чтобы тот, кто имеет доступ к источнику, мог легко изменить его, чтобы расширить язык (новый тип выражения экземпляра) с возможностью расширения расширений во время выполнения (они могут быть включается и выключается).

Мое текущее намерение - создать рекурсивный приличный парсер как объект. Каждое производство будет методом объекта. Метод расширения будет состоять в том, чтобы извлекать классы из этой базы, заменяя методы (и производственные определения) по мере необходимости. Я все еще пытаюсь понять, как смешивать и сопоставлять расширения. Одна идея состоит в том, чтобы играть в игры с V-TBL. Объекты будут создаваться с помощью v-tbl, который является копией базы, но с методами, замененными из производных классов.

Помимо сложного характера решения, единственные проблемы, с которыми я сталкиваюсь, это

  • разумный способ сделать путаницу v-tbl
  • что делать, когда 2 расширения изменяют одну и ту же продукцию (так как большинство замен в конечном итоге вызовет оригинал с одним вызовом замены, другой будет работать, но проблема заключается в механике настройки)
  • как разрешить расширение расширений (это может выглядеть как стандартная система MI, но я так и не понял, как они работают)

Другое решение (немного более приземленная версия того же подхода) состоит в том, чтобы использовать статические переменные-члены для хранения указателей на функции и вызывать их для того же эффекта.

Редактировать: Я уже построил систему, которая позволяет мне создавать производства на основе определений BNF. Я могу изменить это, чтобы поддержать все, что я решу.

Ответы [ 5 ]

1 голос
/ 01 февраля 2010

Я сделал настраиваемый парсер, я загрузил его некоторое время назад в http://code.google.com/p/compparser/ Проект там не обновлен, но работает нормально.

1 голос
/ 24 октября 2008

Вот некоторые из проблем, с которыми столкнулся Perl 6. Возможно, вам стоит взглянуть на некоторые из предложенных ими решений. Или вы можете обнаружить, что это слишком излишне.

0 голосов
/ 24 октября 2008

Честно говоря, я даже не уверен, что понял все, что вы написали ...: -)

Но когда я вижу синтаксический анализатор и гибкость , я думаю о LPeg - грамматиках разбора выражения для Lua . Это может не соответствовать вашим потребностям, но стоит посмотреть ...; -)

0 голосов
/ 24 октября 2008

другой вариант заключается в выражении правил синтаксического анализа в XML или что-то, а не в коде; менее эффективный, но гораздо более динамически настраиваемый; каждый язык или вариант может просто использовать свой собственный (XML) файл и даже включать / ссылаться на другие файлы как «базовые» файлы ...

0 голосов
/ 24 октября 2008

Если я правильно помню свои университетские курсы, парсеры рекурсивного спуска имеют некоторые ограничения, которые могут вас укусить, особенно если вы разрешаете расширения - кто-то, у кого расширение языка может возникнуть, может вызвать проблемы.

Подходящий инструментарий компилятора - такой как открытый исходный код ANTLR - может упростить задачу и также может предложить вам несколько других подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...