| <!-- |
| // This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. |
| // |
| // TagSoup is licensed under the Apache License, |
| // Version 2.0. You may obtain a copy of this license at |
| // http://www.apache.org/licenses/LICENSE-2.0 . You may also have |
| // additional legal rights not granted by this license. |
| // |
| // TagSoup is distributed in the hope that it will be useful, but |
| // unless required by applicable law or agreed to in writing, TagSoup |
| // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS |
| // OF ANY KIND, either express or implied; not even the implied warranty |
| // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| --> |
| |
| <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns:stml="http://www.ccil.org/~cowan/XML/tagsoup/stml" |
| version="1.0"> |
| |
| <xsl:output method="text"/> |
| |
| <xsl:strip-space elements="*"/> |
| |
| <!-- The main template. Generates declarations for states and |
| actions, then the statetable itself, and then a comment (used for |
| manual checking) listing all the actions compactly. --> |
| <xsl:template match="stml:statetable"> |
| <xsl:apply-templates select="stml:state"> |
| <xsl:sort select="@id"/> |
| </xsl:apply-templates> |
| |
| <xsl:apply-templates select="stml:action"> |
| <xsl:sort select="@id"/> |
| </xsl:apply-templates> |
| |
| <xsl:text>	private static int[] statetable = {
</xsl:text> |
| <xsl:apply-templates select="stml:state/stml:tr"> |
| <xsl:sort select="../@id"/> |
| <xsl:sort select="@symbol"/> |
| <xsl:sort select="@char"/> |
| </xsl:apply-templates> |
| <xsl:text>
	};
</xsl:text> |
| |
| <xsl:text>	private static final String[] debug_actionnames = { ""</xsl:text> |
| <xsl:apply-templates select="stml:action" mode="debug"> |
| <xsl:sort select="@id"/> |
| </xsl:apply-templates> |
| <xsl:text>};
</xsl:text> |
| |
| <xsl:text>	private static final String[] debug_statenames = { ""</xsl:text> |
| <xsl:apply-templates select="stml:state" mode="debug"> |
| <xsl:sort select="@id"/> |
| </xsl:apply-templates> |
| <xsl:text>};
</xsl:text> |
| |
| <xsl:text>
</xsl:text> |
| </xsl:template> |
| |
| <!-- Generate a single state declaration. --> |
| <xsl:template match="stml:state"> |
| <xsl:text>	private static final int </xsl:text> |
| <xsl:value-of select="@id"/> |
| <xsl:text> = </xsl:text> |
| <xsl:value-of select="position()"/> |
| <xsl:text>;
</xsl:text> |
| </xsl:template> |
| |
| <!-- Generate a single action declaration. --> |
| <xsl:template match="stml:action"> |
| <xsl:text>	private static final int </xsl:text> |
| <xsl:value-of select="@id"/> |
| <xsl:text> = </xsl:text> |
| <xsl:value-of select="position()"/> |
| <xsl:text>;
</xsl:text> |
| </xsl:template> |
| |
| <!-- Generate a single row of the statetable. --> |
| <xsl:template match="stml:tr"> |
| <xsl:choose> |
| <xsl:when test="@symbol = 'EOF'"> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""-1""/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="@symbol = 'LF'"> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""'\n'""/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="@symbol = 'default'"> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""0""/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="@char = "'""> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""'\''""/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="@symbol = 'S'"> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""' '""/> |
| </xsl:call-template> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""'\n'""/> |
| </xsl:call-template> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" select=""'\t'""/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:call-template name="dump-tr"> |
| <xsl:with-param name="char" |
| select="concat("'", @char, "'")"/> |
| </xsl:call-template> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <!-- This is a subroutine used to do the actual printing. --> |
| <xsl:template name="dump-tr"> |
| <xsl:param name="char"/> |
| <xsl:text>		</xsl:text> |
| <xsl:value-of select="../@id"/> |
| <xsl:text>, </xsl:text> |
| <xsl:value-of select="$char"/> |
| <xsl:text>, </xsl:text> |
| <xsl:value-of select="@action"/> |
| <xsl:text>, </xsl:text> |
| <xsl:value-of select="@newstate"/> |
| <xsl:text>,
</xsl:text> |
| </xsl:template> |
| |
| <!-- Generate a single action name in the "Actions:" comment. |
| The mode is used to keep XSLT from confusing this with the |
| regular actions template that does the action declarations. --> |
| <xsl:template match="stml:action" mode="debug"> |
| <xsl:text>, "</xsl:text> |
| <xsl:value-of select="@id"/> |
| <xsl:text>"</xsl:text> |
| </xsl:template> |
| |
| <!-- Generate a single stat debug name. --> |
| <xsl:template match="stml:state" mode="debug"> |
| <xsl:text>, "</xsl:text> |
| <xsl:value-of select="@id"/> |
| <xsl:text>"</xsl:text> |
| </xsl:template> |
| |
| </xsl:transform> |