/* This file was generated by SableCC (http://www.sablecc.org/). */

package com.google.clearsilver.jsilver.syntax.parser;

import com.google.clearsilver.jsilver.syntax.node.*;
import com.google.clearsilver.jsilver.syntax.analysis.*;

class TokenIndex extends AnalysisAdapter
{
    int index;

    @Override
    public void caseTData(@SuppressWarnings("unused") TData node)
    {
        this.index = 0;
    }

    @Override
    public void caseTComment(@SuppressWarnings("unused") TComment node)
    {
        this.index = 1;
    }

    @Override
    public void caseTVar(@SuppressWarnings("unused") TVar node)
    {
        this.index = 2;
    }

    @Override
    public void caseTLvar(@SuppressWarnings("unused") TLvar node)
    {
        this.index = 3;
    }

    @Override
    public void caseTEvar(@SuppressWarnings("unused") TEvar node)
    {
        this.index = 4;
    }

    @Override
    public void caseTUvar(@SuppressWarnings("unused") TUvar node)
    {
        this.index = 5;
    }

    @Override
    public void caseTSet(@SuppressWarnings("unused") TSet node)
    {
        this.index = 6;
    }

    @Override
    public void caseTIf(@SuppressWarnings("unused") TIf node)
    {
        this.index = 7;
    }

    @Override
    public void caseTElseIf(@SuppressWarnings("unused") TElseIf node)
    {
        this.index = 8;
    }

    @Override
    public void caseTElse(@SuppressWarnings("unused") TElse node)
    {
        this.index = 9;
    }

    @Override
    public void caseTWith(@SuppressWarnings("unused") TWith node)
    {
        this.index = 10;
    }

    @Override
    public void caseTEscape(@SuppressWarnings("unused") TEscape node)
    {
        this.index = 11;
    }

    @Override
    public void caseTAutoescape(@SuppressWarnings("unused") TAutoescape node)
    {
        this.index = 12;
    }

    @Override
    public void caseTLoop(@SuppressWarnings("unused") TLoop node)
    {
        this.index = 13;
    }

    @Override
    public void caseTEach(@SuppressWarnings("unused") TEach node)
    {
        this.index = 14;
    }

    @Override
    public void caseTAlt(@SuppressWarnings("unused") TAlt node)
    {
        this.index = 15;
    }

    @Override
    public void caseTName(@SuppressWarnings("unused") TName node)
    {
        this.index = 16;
    }

    @Override
    public void caseTDef(@SuppressWarnings("unused") TDef node)
    {
        this.index = 17;
    }

    @Override
    public void caseTCall(@SuppressWarnings("unused") TCall node)
    {
        this.index = 18;
    }

    @Override
    public void caseTInclude(@SuppressWarnings("unused") TInclude node)
    {
        this.index = 19;
    }

    @Override
    public void caseTLinclude(@SuppressWarnings("unused") TLinclude node)
    {
        this.index = 20;
    }

    @Override
    public void caseTContentType(@SuppressWarnings("unused") TContentType node)
    {
        this.index = 21;
    }

    @Override
    public void caseTInline(@SuppressWarnings("unused") TInline node)
    {
        this.index = 22;
    }

    @Override
    public void caseTComma(@SuppressWarnings("unused") TComma node)
    {
        this.index = 23;
    }

    @Override
    public void caseTBang(@SuppressWarnings("unused") TBang node)
    {
        this.index = 24;
    }

    @Override
    public void caseTAssignment(@SuppressWarnings("unused") TAssignment node)
    {
        this.index = 25;
    }

    @Override
    public void caseTEq(@SuppressWarnings("unused") TEq node)
    {
        this.index = 26;
    }

    @Override
    public void caseTNe(@SuppressWarnings("unused") TNe node)
    {
        this.index = 27;
    }

    @Override
    public void caseTLt(@SuppressWarnings("unused") TLt node)
    {
        this.index = 28;
    }

    @Override
    public void caseTGt(@SuppressWarnings("unused") TGt node)
    {
        this.index = 29;
    }

    @Override
    public void caseTLte(@SuppressWarnings("unused") TLte node)
    {
        this.index = 30;
    }

    @Override
    public void caseTGte(@SuppressWarnings("unused") TGte node)
    {
        this.index = 31;
    }

    @Override
    public void caseTAnd(@SuppressWarnings("unused") TAnd node)
    {
        this.index = 32;
    }

    @Override
    public void caseTOr(@SuppressWarnings("unused") TOr node)
    {
        this.index = 33;
    }

    @Override
    public void caseTString(@SuppressWarnings("unused") TString node)
    {
        this.index = 34;
    }

    @Override
    public void caseTHash(@SuppressWarnings("unused") THash node)
    {
        this.index = 35;
    }

    @Override
    public void caseTPlus(@SuppressWarnings("unused") TPlus node)
    {
        this.index = 36;
    }

    @Override
    public void caseTMinus(@SuppressWarnings("unused") TMinus node)
    {
        this.index = 37;
    }

    @Override
    public void caseTStar(@SuppressWarnings("unused") TStar node)
    {
        this.index = 38;
    }

    @Override
    public void caseTPercent(@SuppressWarnings("unused") TPercent node)
    {
        this.index = 39;
    }

    @Override
    public void caseTBracketOpen(@SuppressWarnings("unused") TBracketOpen node)
    {
        this.index = 40;
    }

    @Override
    public void caseTBracketClose(@SuppressWarnings("unused") TBracketClose node)
    {
        this.index = 41;
    }

    @Override
    public void caseTParenOpen(@SuppressWarnings("unused") TParenOpen node)
    {
        this.index = 42;
    }

    @Override
    public void caseTParenClose(@SuppressWarnings("unused") TParenClose node)
    {
        this.index = 43;
    }

    @Override
    public void caseTDot(@SuppressWarnings("unused") TDot node)
    {
        this.index = 44;
    }

    @Override
    public void caseTDollar(@SuppressWarnings("unused") TDollar node)
    {
        this.index = 45;
    }

    @Override
    public void caseTQuestion(@SuppressWarnings("unused") TQuestion node)
    {
        this.index = 46;
    }

    @Override
    public void caseTDecNumber(@SuppressWarnings("unused") TDecNumber node)
    {
        this.index = 47;
    }

    @Override
    public void caseTHexNumber(@SuppressWarnings("unused") THexNumber node)
    {
        this.index = 48;
    }

    @Override
    public void caseTWord(@SuppressWarnings("unused") TWord node)
    {
        this.index = 49;
    }

    @Override
    public void caseTSlash(@SuppressWarnings("unused") TSlash node)
    {
        this.index = 50;
    }

    @Override
    public void caseTCsOpen(@SuppressWarnings("unused") TCsOpen node)
    {
        this.index = 51;
    }

    @Override
    public void caseTCommentStart(@SuppressWarnings("unused") TCommentStart node)
    {
        this.index = 52;
    }

    @Override
    public void caseTCommandDelimiter(@SuppressWarnings("unused") TCommandDelimiter node)
    {
        this.index = 53;
    }

    @Override
    public void caseTHardDelimiter(@SuppressWarnings("unused") THardDelimiter node)
    {
        this.index = 54;
    }

    @Override
    public void caseTCsClose(@SuppressWarnings("unused") TCsClose node)
    {
        this.index = 55;
    }

    @Override
    public void caseEOF(@SuppressWarnings("unused") EOF node)
    {
        this.index = 56;
    }
}
