Помощь в разработке компилятора

Возможный дубликат:
Учимся писать компилятор

Мне нужно придумать фиктивный язык, подобный SQL, с очень ограниченными функциями. Я никогда раньше не занимался компилятором или парсингом. Может ли кто-нибудь сообщить мне, что хорошим началом может быть ссылка или пример того же. Я такой невежественный.

Я буду использовать этот фиктивный язык с C / C ++ в качестве основного.

Спасибо


person keeda    schedule 28.07.2011    source источник
comment
Это довольно странная просьба. Вы можете объяснить, почему это полезно?   -  person Ira Baxter    schedule 29.07.2011
comment
@Ira: Я пишу приложение, которое использует sqlite3 для своей базы данных. база данных заполняется содержимым XML, и это содержимое сохраняется с использованием логики вложенной модели [en.wikipedia.org/wiki / Nested_set_model] Чтобы запросить эту базу данных, мне нужно придумать фиктивный SQL-подобный язык, который в конечном итоге преобразовал бы в сложный оператор SQL и запросил бы мою базу данных. запросить базу данных с помощью sql будет невозможно повторно использовать.   -  person keeda    schedule 29.07.2011
comment
Если вы никогда раньше не занимались компилятором или синтаксическим анализом, почему вы думаете, что хорошо подготовлены к разработке эффективного языка запросов (синтаксиса, семантики, прагматики, выразительности)? Если вы храните XML, вам может быть лучше использовать XPath (вы уже знаете, что он хорошо спроектирован) в качестве языка запросов и переводить его в схему, которую вы храните, или просто хранить XML, а не напрямую в базе данных. Это по-прежнему оставляет вам проблему синтаксического анализа XPath и преобразования XPath в вызовы SQL, что, вероятно, будет довольно сложно для кого-то без опыта. Просто пытаюсь быть реалистом.   -  person Ira Baxter    schedule 29.07.2011
comment
@Ira: Моя цель с этим новым фиктивным языком - предоставить более простой механизм запросов, следовательно, это должно быть очень небольшое подмножество SQL. Поскольку в бэкэнде я по-прежнему буду использовать язык запросов SQL, я просто ищу промежуточный фиктивный язык для определения реального SQL. Более того, я начал читать о BNF и Bison для GNU. Не выглядит проще, но и не выглядит недостижимым. Я ранее представил идею XPath, но она не была оценена моими коллегами из-за соображений эффективности для конкретного приложения.   -  person keeda    schedule 29.07.2011
comment
Мне сложно это понять. Итак, люди отвергли XPath, полагая, что существует какая-то неизвестная, но определяемая нотация запроса, которая повысила бы эффективность, и поручили вам, новичку в разработке / внедрении языка, работу по разработке и внедрению этого языка? Послушайте, я не пытаюсь сказать «нет», но я думаю, что шансы на это очень высоки.   -  person Ira Baxter    schedule 29.07.2011
comment
@Ira: Я понимаю вашу точку зрения, но с другой стороны, я начинаю изучать новые вещи, такие как основы компилятора и синтаксического анализа. Я здесь стажер, так что я думаю, что придется принять все, что брошено мне на тарелку. Посмотрим, как это работает.   -  person keeda    schedule 29.07.2011
comment
Что ж, если вы стажер, то от вашего реального успеха, скорее всего, никто не будет зависеть. В том случае, если они дадут вам возможность поиграть с этим (я думаю, что они сумасшедшие, но это их проблема), вам обязательно стоит это сделать. Считайте меня энтузиастом вашей учебной деятельности теперь, когда я понимаю обстоятельства. Я бы начал с вопроса почему XPath воспринимается как медленный; вы не хотите, чтобы ваше решение было медленным по тем же причинам. Я подозреваю, что у вас возникнут проблемы с эффективностью этого, что бы вы ни делали; RDB и древовидные структуры, такие как XML, обычно неэффективны, точка.   -  person Ira Baxter    schedule 29.07.2011


Ответы (3)


Dragon Book часто считается хорошей отправной точкой. . Однако я также рекомендую книгу ANTLR.

person Yann Ramin    schedule 28.07.2011

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

Вам следует проверить Генераторы синтаксического анализатора, особенно ссылку на сравнение генераторов парсеров

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

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

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

На самом деле вам нужна интегрированная система инструментов, которые анализируют, создают AST, могут их анализировать, переводить и т. Д. Таких инструментов не так много. Наш DMS Software Reengineering Toolkit предоставляет все необходимое оборудование в качестве основы. Возможно, вы действительно не захотите использовать его, но вы должны знать об этом виде инструмента, чтобы вы могли сделать сознательный выбор и сделать все самостоятельно.

person Ira Baxter    schedule 29.07.2011

В прошлом году я прошел курс построения компилятора, и мы использовали книгу

Конструкция компилятора Кеннетом К. Лауденом

Он очень подробный с хорошей теоретической подготовкой. При этом автор приводит достаточно примеров и использует очень информативные цифры, чтобы вы никогда не заблудились при обучении. В конце концов, компилятор на C для игрушечного языка будет перечислен в следующих главах.

Мне действительно это понравилось!

person das_weezul    schedule 29.07.2011