Можно ли использовать Xtext для анализа языков программирования общего назначения? - PullRequest
19 голосов
/ 12 апреля 2011

В настоящее время я разрабатываю универсальный язык программирования на основе агентов (его синтаксис будет несколько вдохновлен Java, и мы также используем объект на этом языке).

С самого начала проекта мы сомневались в факте использования ANTLR или Xtext . В то время мы узнали, что Xtext реализует подмножество функции ANTLR. Поэтому мы решили использовать ANLTR для нашего языка, потеряв возможность бесплатно иметь полноценный редактор Eclipse для нашего языка (такие приятные функции предоставляет Xtext).

Однако, насколько мне известно, этим летом проект Xtext сделал большой шаг вперед . Цитирование по ссылке:

Каковы ограничения Xtext?

Свен: Вы можете реализовать практически любой язык программирования или DSL. с Xtext. Есть одно исключение, это если вам нужно использовать так называется «семантические предикаты», что довольно сложная вещь, которую я не думаю, что здесь стоит объяснять. Очень мало языков на самом деле нужна эта концепция. Однако ярким примером является C / C ++. Мы хотим изучите эту тему для следующего выпуска.

И это также подчеркивается в Xtext документации :

Что такое Xtext? Неважно, хотите ли вы создать небольшой текстовый предметно-ориентированный язык (DSL) или вы хотите реализовать полноценный язык язык программирования общего назначения. С Xtext вы можете создать свой очень собственные языки в оснастке. Также, если у вас уже есть существующий язык, но ему не хватает приличной поддержки инструментов, вы можете использовать Xtext для создания сложная среда разработки на основе Eclipse, обеспечивающая опыт редактирования, известный из современных Java IDE в удивительно коротком количество времени. Мы называем Xtext фреймворком для развития языка.

Если Xtext избавился от своих прошлых ограничений, почему все еще невозможно найти сложную грамматику Xtext для самых известных языков программирования (Java, C # и т. Д.)?

На веб-сайте ANTLR вы можете найти тонны таких примеров грамматики. Что касается Xtext, то единственный пример, который мне удалось найти, - это тот, который описан в документации. Так, может быть, Xtext еще не созрел для использования в языке программирования общего назначения? Я немного беспокоюсь об этом ... Я бы не стал переписывать грамматику в Xtext, чтобы потом признать, что она не подходит для этого.

Ответы [ 5 ]

15 голосов
/ 12 апреля 2011

Я думаю, что никто не реализовал Java или C ++, потому что это много работы (даже с Xtext) и существующие инструменты и компиляторы превосходны. Однако вы можете взглянуть на Xbase и Xtend, язык выражения, который мы поставляем вместе с Xtext. Он построен с Xtext и является хорошим доказательством того, что вы можете построить с Xtext. Мы сделали это примерно за 4 человеко-месяца.

Я сделал пару скринкастов на Xtend:

http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html

Обратите внимание, что вы можете просто встраивать выражения Xbase в свой язык.

3 голосов
/ 12 апреля 2011

Я не могу говорить о том, что Xtext является или делает хорошо.

Я могу поговорить о проблеме разработки надежных инструментов для обработки реальных языков, основываясь на нашем опыте с DMS Software Reengineering Toolkit , который, как мы представляем, является структурой манипулирования .

Во-первых, парсинг реальных языков обычно включает в себя что-то грязное в лексизировании и / или парсинге из-за исторических путей, в которых эти языки развивались. Ява довольно чистая. C # имеет контекстно-зависимые ключевые слова и элементарный препроцессор вроде C. С имеет полноценный препроцессор. С ++ классно «трудно анализировать» из-за неясностей в грамматике и махинаций с синтаксисом шаблонов. COBOL довольно уродлив, не имеет справочных грамматик и поставляется на разных диалектах. PHP превратит вас в камень, если вы посмотрите на него, потому что он так плохо определен. (У DMS есть парсеры для всего этого, используемые в гневе на реальных приложениях).

Тем не менее, вы можете проанализировать все это с большинством доступных технологий синтаксического анализа, если попытаетесь достаточно усердно, обычно, злоупотребляя лексером или синтаксическим анализатором для достижения ваших целей (как парни из GNU злоупотребляли Bison для анализа C ++, запутывая лексический анализ поиск таблицы символов - хороший уродливый случай. Но чтобы правильно понять детали языка, нужно приложить немало усилий, а справочные руководства являются лишь приблизительным приближением к истине относительно того, что на самом деле принимают компиляторы.

Если Xtext имеет приличный механизм синтаксического анализа, то, вероятно, это можно сделать с помощью Xtext. Краткое прочтение сайта Xtext звучит так, как будто лексеры и парсеры довольно приличны. Я ничего не видел о "Семантическом Предикате"; у нас они есть в DMS, и они спасают жизнь в некоторых действительно темных уголках разбора. Даже используя действительно хорошую технологию синтаксического анализа (мы используем анализаторы GLR), было бы очень трудно проанализировать объявления данных COBOL (извлекая их структуру вложенности во время анализа) без них.

У вас есть интересная проблема в том, что ваш язык еще недостаточно определен. Это сделает ваши начальные парсеры несколько грязными, и вы будете их много пересматривать. Вот где вам помогает мощная технология синтаксического анализа: если вы можете легко пересмотреть свою грамматику, вы можете сосредоточиться на том, как вы хотите, чтобы ваш язык выглядел, а не на борьбе с лексером и анализатором. Тот факт, что вы можете изменить определение языка, фактически означает, что если Xtext имеет некоторые ограничения, вы, вероятно, сможете изменить свой синтаксис языка, чтобы он соответствовал без огромного количества боли. ANTLR обладает доказанной способностью анализировать язык практически так, как вы его себе представляете, по модулю обычного количества взломов анализатора.

Что никогда не обсуждается, так это то, что еще нужно для реальной обработки языка. Первое, что вам нужно уметь делать, - это создавать AST, которые ANTLR и YACC помогут вам сделать; Я полагаю, Xtext тоже. Вам также нужны таблицы символов, контроль и анализ потоков данных (как локальных, так и глобальных), а также оборудование для преобразования вашего языка во что-то другое (предположительно, более исполняемый). Делать только таблицы символов вы найдете на удивление сложно; C ++ имеет несколько сотен страниц «как найти идентификатор»; Обобщения Java гораздо сложнее понять, чем вы могли бы ожидать. Вы также можете распечатать AST обратно к исходному коду, если вы хотите предложить рефакторинг. (РЕДАКТИРОВАТЬ: Здесь и ANTLR, и Xtext предлагают то, что равнозначно генерации кода на основе текстовых шаблонов).

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

При чтении обзора Xtext кажется, что у них есть некоторая поддержка таблиц символов, но неясно, какие предположения стоят за ним (например, для C ++ вы должны поддерживать множественное наследование и пространства имен).

Если вы уже начали движение по дороге ANTLR и у вас что-то работает, у меня будет соблазн остаться на курсе; Я сомневаюсь, что Xtext предложит вам много дополнительной помощи. Если вам действительно нужен редактор Xtext, то вы, вероятно, можете переключиться на цену реструктуризации имеющейся у вас грамматики (это довольно типичная цена, которую приходится платить при изменении парадигм разбора). Ожидайте, что большая часть вашей работы появится после того, как вы правильно разберетесь в синтаксическом анализаторе. Я сомневаюсь, что вы найдете Xtext или ANTLR здесь совсем другими.

2 голосов
/ 07 ноября 2011
1 голос
/ 01 ноября 2011

Я использую Xtext уже два года для реализации языка Umple (http://cruise.site.uottawa.ca/umple/). Umple - это язык моделирования общего назначения, который позволяет разработчикам встраивать другие языки программирования высокого уровня (например, Java и PhP). Итак, мне нужен Xtext чтобы иметь возможность ссылаться на грамматику других языков (например, Java). Мне не удалось найти грамматику Java, написанную на Xtext. Грамматика перекрестных ссылок - хорошая функция, но я не хочу идти по пути переписывания грамматики Java в xtext. Любые идеи или помощь приветствуется.

0 голосов
/ 12 апреля 2011

Полагаю, самый простой ответ на ваш вопрос: многие языки общего назначения могут быть реализованы с использованием Xtext. Но поскольку нет общего ответа на вопрос о том, какие возможности синтаксического анализатора нужны языкам общего назначения, нет общего ответа на ваши вопросы.

Однако у меня есть несколько указателей:

  • В Xtext 2.0 (выпущенном этим летом) Xtext поддерживает синтаксические предикаты. Это одна из наиболее востребованных функций для обработки неоднозначного синтаксиса без включения обратного отслеживания antlr.

  • Возможно, вы захотите взглянуть на новые языки Xbase и Xtend, которые (судя по их возможностям) универсальны и разработаны с использованием Xtext. У Свена есть несколько хороших скриншотов в его блоге: http://blog.efftinge.de/

Относительно вашего вопроса, почему мы не видим Xtext-грамматики для Java, C ++ и т. Д .: В Xtext язык - это больше, чем просто грамматика, поэтому наличие грамматики, описывающей синтаксис языка, является хорошей отправной точкой, но обычно не является достаточно ценным для доставки артефактом. Причина в том, что с помощью Xtext-грамматики вы также определяете структуру AST (абстрактное синтаксическое дерево и модель Ecore), включая истинные перекрестные ссылки. Поскольку эта модель является основным внутренним API вашего языка, люди обычно тратят много времени на его разработку. Кроме того, для разрешения перекрестных ссылок (также называемых ссылками) вам необходимо реализовать область видимости (как это называется в Xtext). Без надлежащей реализации области видимости у вас может не быть истинных перекрестных ссылок в вашей модели, или вы получите много ошибок выравнивания.

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

НТН, Moritz

...