2010-02-04 17 views
1

我正在使用基於XML架構的DSL,該XML架構支持循環,帶有上下文的可變狀態以及調用外部Java類等功能語言特性。我想編寫一個工具,它將XML文檔轉換爲至少一些看起來像Java的東西,其中<set>標籤被轉換爲變量賦值,循環被轉換爲for循環,等等。如何將XML中的函數式語言轉換爲Java?

我一直在尋找ANTLR以及標準的XML解析器,我想知道是否有推薦的方法來解決這個問題。如果不是直接的話,這樣的XML文檔可以轉換成可轉換爲Java的東西嗎?

如果這是推薦的方式,我願意編寫通過SAX編寫基於每個標記的中間語言的解析,但是讓我暫停的部分是它基於上下文的事實,像Scheme這樣的語言,任何標籤的子元素都在父元素之前完全評估。

+0

您可否詳細說明'功能語言功能,如循環'。你對循環的定義是什麼? – 2010-02-04 19:05:07

+0

以下內容: myList<! - 對myList的每個元素執行一些操作 - >。有點像JSP/EL。 – Jon 2010-02-04 19:21:53

回答

2

您可以使用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> 

不是e a.xml包含一條指令,該指令將允許支持XSLT的瀏覽器使用樣式表b.xsl進行呈現。 Firefox是這樣的瀏覽器。在Firefox並打開A.XML會看到

myVar="newText_"+otherVar 

注意,XSLT是一個相當有能力的編程語言,所以有很多可以做。

+0

對不起,我有點失落 - 你能否舉一個例子說明我會如何寫下如下的變換? newText_ otherVar - > myVar =「newText_」+ otherVar; – Jon 2010-02-05 16:45:50

+0

+1,用於推薦現有的,現成的技術,而不是讓OP跳躍。現在找到一個合適的XSLT庫來把它變成一個應用程序... – 2010-02-06 13:20:03

+0

對不起,我花了一段時間才能真正嘗試這個。它對我來說工作得很好,但它仍然必須是一箇中間語言,因爲我仍然需要使用變量範圍等進行引用檢查。 – Jon 2010-02-16 20:21:40

相關問題