【问题标题】:How can I transform a functional language in XML to Java?如何将 XML 中的函数式语言转换为 Java?
【发布时间】:2010-02-04 19:01:55
【问题描述】:

我正在使用基于 XML 模式的 DSL,该模式支持函数式语言特性,例如循环、带有上下文的变量状态以及对外部 Java 类的调用。我想编写一个工具,它接收 XML 文档并将其转换为至少看起来像 Java 的东西,其中<set> 标签被转换为变量赋值,循环被转换为for 循环,等等。

我一直在研究 ANTLR 以及标准 XML 解析器,我想知道是否有推荐的方法来解决这个问题。如果不能直接将这样的 XML 文档转换为可转换为 Java 的内容,是否可以?

如果这是推荐的方式,我愿意通过 SAX 编写基于每个标签编写中间语言的解析,但让我暂停的部分是它以与语言相同的方式基于上下文的事实就像 Scheme 一样,任何标签的子元素都在父元素之前被完全评估。

【问题讨论】:

  • 您能否详细说明“函数式语言功能,例如循环”。你对循环的定义是什么?
  • 类似于:myList。有点像 JSP/EL。

标签: java xml antlr dsl


【解决方案1】:

您可以使用 XSLT 做到这一点。然后就用sn-ps生成你需要的代码。

(记得设置输出格式为纯文本)


编辑:示例 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 就是这样的浏览器。在firefox中打开a.xml就会看到

myVar="newText_"+otherVar

请注意,XSLT 是一种功能强大的编程语言,因此您可以做很多事情。

【讨论】:

  • 抱歉,我有点迷路了——你能举个例子说明我如何从以下内容编写转换吗? newText_otherVar --> myVar = "newText_" + otherVar;
  • +1 用于推荐现有的、现成的技术,而不是让 OP 跳槽。现在要找到一个合适的 XSLT 库来把它变成一个应用程序......
  • 抱歉耽搁了,我花了一段时间才真正尝试这个。它对我来说工作得很好,但它仍然必须是一种中间语言,因为我仍然需要对变量范围等进行引用检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多