2008-10-24 3 views
1

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

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

Помимо бит вертел характера решения единственные вопросы, я с ней

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

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

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

ответ

1

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

0

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

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

+0

Я (мучительно) знаю об ограничениях рекурсивного приличного (и вообще LL) :(Я пробовал ANTLR и никогда не работал правильно. Хотя он может быть полезен, мне, вероятно, придется изменить его внутренности для использования. – BCS 2008-10-24 21:00:35

0

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

+0

Кроме того, в некоторых отношениях гораздо сложнее. Я должен разбирать XML (или что-то еще), а затем создавать из него парсер, который может быть немедленно запущен. Преимущество будет меньше «кода», но чтобы сделать это мне нужно было бы избежать необходимости писать код для действий в грамматике (Ouch). – BCS 2008-10-24 21:05:39

0

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^