<?xml version="1.0" encoding="Windows-1251" ?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://forth.org.ru/2006/SXSL/"
  xmlns:f="http://forth.org.ru/ForthML/"
  f:used="used"
>

<xsl:output
  encoding="UTF-8"
  indent="yes"
  method="text"
/>

<def match="*">
  <xsl:message terminate = "yes">
    <xsl:text>Semantic undefined for: </xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>
</xsl:text>
    <xsl:copy-of select="."/>
  </xsl:message>
</def>


<var name="state" select="0" />

<def name="do">
  <set name="state" select="$state - 1"><yield/></set>
</def>

<def name="compile">
  <set name="state" select="$state + 1"><yield/></set>
</def>

<def name="T-LIT">
  <xsl:if test="$state = 1">
    <xsl:text>LIT, </xsl:text>
  </xsl:if>
  <xsl:if test="$state &gt; 1">
    <do><T-LIT/><xsl:text>`LIT, ? </xsl:text><T-NATIVE/></do>
  </xsl:if>
</def>

<def name="T-SLIT">
  <xsl:if test="$state = 1">
    <xsl:text>SLIT, </xsl:text>
  </xsl:if>
  <xsl:if test="$state &gt; 1">
    <do><T-SLIT/><xsl:text>`SLIT, ? </xsl:text><T-NATIVE/></do>
  </xsl:if>
</def>

<def name="T-NATIVE">
  <xsl:choose><xsl:when test="$state = 0">
    <xsl:text>EXECUTE </xsl:text>
  
  </xsl:when><xsl:when test="$state = 1">
    <xsl:text>XT, </xsl:text>
  
  </xsl:when><xsl:otherwise>

    <do><T-LIT/><xsl:text>`XT, ? </xsl:text><T-NATIVE/></do>
  </xsl:otherwise></xsl:choose>
</def>

<def name="T-WORD">
  <xsl:param name="word" select="."/>

  <xsl:choose xmlns:fn="http://www.w3.org/2005/xpath-functions" fn:used="used">
  <xsl:when test="fn:matches($word, '^`\S+')">
    <xsl:value-of select="$word"/><xsl:text> </xsl:text>
    <T-SLIT/>

  </xsl:when>
  <xsl:when test="fn:matches($word, '^\d+$')">
    <xsl:value-of select="$word"/><xsl:text> </xsl:text>
    <T-LIT/>

  </xsl:when>
  <xsl:when test="fn:matches($word, '^0x\d+$')">
    <xsl:value-of select="$word"/><xsl:text> </xsl:text>
    <T-LIT/>

  </xsl:when>
  <xsl:otherwise>
    <xsl:text>`</xsl:text><xsl:value-of select="$word"/><xsl:text> </xsl:text>
    <xsl:text>? </xsl:text>
    <T-NATIVE/>

  </xsl:otherwise></xsl:choose>
</def>

<def name="T">
  <xsl:variable name="text"><yield/></xsl:variable>
  <xsl:variable name="text2" select="normalize-space($text)"/>
  <xsl:if test="$text2">

  <xsl:choose><xsl:when test="$state = 0">

    <xsl:value-of select="$text2" /><xsl:text> </xsl:text>

  </xsl:when><xsl:otherwise>

    <xsl:analyze-string select="$text2" regex="\S+">
    <xsl:non-matching-substring>
        <!-- 
        <xsl:value-of select="." /> -->
    </xsl:non-matching-substring><xsl:matching-substring>

        <T-WORD/>

    </xsl:matching-substring>
    </xsl:analyze-string>

  </xsl:otherwise></xsl:choose>

  </xsl:if>
</def>

<def name="p" match="f:p"><!-- postpone as entire -->
  <T>CONCEIVE</T>
  <compile><yield/></compile>
  <T>BIRTH</T>
</def>

<def match="f:def">
  <p/><T>`<xsl:value-of select="@name"/> MAKE-ENTRY BIND-ENTRY</T>
</def>

<def match="f:lit">
  <do><yield/><T>LIT,</T></do>
</def>

<def match="f:slit">
  <do><yield/><T>SLIT,</T></do>
</def>

<def match="f:exec">
  <do><yield/><T>XT,</T></do>
</def>

<def match="f:exit">
  <do><T>RET,</T></do>
</def>
<def match="f:recurse">
  <do><T>GET-CORCULE XT,</T></do>
</def>

<def match="f:if">
  <do><T>ZBRANCH-FW,</T></do>
  <yield/>
  <do><T>RESOLVE-MARK</T></do>
</def>
<def match="f:again[node()] | f:repeat[node()]">
  <do><T>MARK-BW</T></do>
  <yield/>
  <do><T>BRANCH-BW,</T></do>
  <xsl:for-each select="f:while[not(node)]">
    <do><T>RESOLVE-MARK</T></do>
  </xsl:for-each>
</def>
<def match="f:until[node()]">
  <do><T>MARK-BW</T></do>
  <yield/>
  <do><T>ZBRANCH-BW,</T></do>
</def>
<def match="f:if/f:else">
  <do><T>BRANCH-FW2, RESOLVE-MARK</T></do>
  <yield/>
  <do><T>RESOLVE-MARK</T></do>
</def>
<def match="f:repeat/f:while[not(node())]">
  <do><T>ZBRANCH-FW2,</T></do>
</def>

<def match="text()">
  <T><xsl:value-of select="."/></T>
</def>

<def match="f:rem | f:comment" />

<def match="f:g">
  <yield/>
</def>

<def match="f:base">
  <xsl:text>CSSAVE-BASE </xsl:text>
  <xsl:value-of select="@eval"/><xsl:text> </xsl:text>
  <yield/>
  <xsl:text>CSRESTORE-BASE </xsl:text>
</def>

<def match="f:code">
  <set name="state" select="0">
  <xsl:text>CONCEIVE ALSO ASSEMBLER </xsl:text>
  <yield/>
  <!--
  <xsl:text>END-CODE </xsl:text>
  -->

  <xsl:text> PREVIOUS </xsl:text>
  <xsl:text>`</xsl:text><xsl:value-of select="@name"/><xsl:text> </xsl:text>
  <xsl:text>BIRTH MAKE-ENTRY BIND-ENTRY </xsl:text>
  </set>
</def>

<def match="f:include">
  <xsl:apply-templates select="document(@href)/*"/>
</def>

<def match="/*">
  <yield/>
</def>

</xsl:stylesheet>
