Как я могу преобразовать функциональный язык из XML в Java? - PullRequest
1 голос
/ 04 февраля 2010

Я работаю с DSL, основанным на схеме XML, которая поддерживает функции функционального языка, такие как циклы, переменное состояние с контекстом и вызовы внешних классов Java. Я хотел бы написать инструмент, который берет XML-документ и преобразует его, по крайней мере, во что-то похожее на Java, где теги <set> преобразуются в присваивания переменных, циклы преобразуются в циклы for, и т. д.

Я изучал ANTLR, а также стандартные синтаксические анализаторы XML, и мне интересно, есть ли рекомендуемый способ сделать это. Можно ли преобразовать такой XML-документ во что-то, что можно конвертировать в Java, если не напрямую?

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

1 Ответ

2 голосов
/ 04 февраля 2010

Вы можете сделать это с помощью XSLT. Затем просто используйте для генерации фрагментов кода, которые вам нужны.

(не забудьте установить формат вывода для простого текста)


РЕДАКТИРОВАТЬ: Пример сценария XSLT

Ввод - a.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="b.xsl"?>
<set name='myVar'>
  <concat>
    <s>newText_</s>
    <ref>otherVar</ref>
  </concat>
</set>

Сценарий - b.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*"/>
  <xsl:output method="text" />

  <xsl:template match="set">
    <xsl:value-of select="@name"/>=<xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="concat">
    <xsl:for-each select="*">
      <xsl:if test="position() > 1">+</xsl:if>
      <xsl:apply-templates select="."/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="ref">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="s">
    <xsl:text>"</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>"</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание, что a.xml содержит инструкцию, которая позволит браузерам с поддержкой XSLT отображать ее с помощью таблицы стилей b.xsl. Firefox такой браузер. Откройте a.xml в Firefox, и вы увидите

myVar="newText_"+otherVar

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

...