// Path: src/java/net/rkoubou/kspparser/analyzer/SymbolDefinition.java
// public enum SymbolType
// {
//     Unknown,
//     Callback,
//     Command,
//     UserFunction,
//     Variable,
//     Literal,
//     Expression,
//     PreprocessorSymbol,
// };
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/ASTPreProcessorDefine.java
// public
// class ASTPreProcessorDefine extends SimpleNode {
//   public ASTPreProcessorDefine(int id) {
//     super(id);
//   }
// 
//   public ASTPreProcessorDefine(KSPParser p, int id) {
//     super(p, id);
//   }
// 
// 
//   /** Accept the visitor. **/
//   public Object jjtAccept(KSPParserVisitor visitor, Object data) {
// 
//     return
//     visitor.visit(this, data);
//   }
// }
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/ASTPreProcessorUnDefine.java
// public
// class ASTPreProcessorUnDefine extends SimpleNode {
//   public ASTPreProcessorUnDefine(int id) {
//     super(id);
//   }
// 
//   public ASTPreProcessorUnDefine(KSPParser p, int id) {
//     super(p, id);
//   }
// 
// 
//   /** Accept the visitor. **/
//   public Object jjtAccept(KSPParserVisitor visitor, Object data) {
// 
//     return
//     visitor.visit(this, data);
//   }
// }
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/KSPParserTreeConstants.java
// public interface KSPParserTreeConstants
// {
//   public int JJTROOTNODE = 0;
//   public int JJTVOID = 1;
//   public int JJTVARIABLEDECLARATION = 2;
//   public int JJTVARIABLEINITIALIZER = 3;
//   public int JJTPRIMITIVEINITITALIZER = 4;
//   public int JJTARRAYINITIALIZER = 5;
//   public int JJTCALLBACKDECLARATION = 6;
//   public int JJTCALLBACKARGUMENTLIST = 7;
//   public int JJTUSERFUNCTIONDECLARATION = 8;
//   public int JJTBLOCK = 9;
//   public int JJTPREPROCESSORDEFINE = 10;
//   public int JJTPREPROCESSORUNDEFINE = 11;
//   public int JJTPREPROCESSORIFDEFINED = 12;
//   public int JJTPREPROCESSORIFUNDEFINED = 13;
//   public int JJTIFSTATEMENT = 14;
//   public int JJTSELECTSTATEMENT = 15;
//   public int JJTCASESTATEMENT = 16;
//   public int JJTCASECONDITION = 17;
//   public int JJTWHILESTATEMENT = 18;
//   public int JJTCALLUSERFUNCTIONSTATEMENT = 19;
//   public int JJTASSIGNMENT = 20;
//   public int JJTCONDITIONALOR = 21;
//   public int JJTCONDITIONALAND = 22;
//   public int JJTSTRADD = 23;
//   public int JJTBITWISEOR = 24;
//   public int JJTBITWISEAND = 25;
//   public int JJTEQUAL = 26;
//   public int JJTNOTEQUAL = 27;
//   public int JJTLT = 28;
//   public int JJTGT = 29;
//   public int JJTLE = 30;
//   public int JJTGE = 31;
//   public int JJTADD = 32;
//   public int JJTSUB = 33;
//   public int JJTMUL = 34;
//   public int JJTDIV = 35;
//   public int JJTMOD = 36;
//   public int JJTNEG = 37;
//   public int JJTNOT = 38;
//   public int JJTLOGICALNOT = 39;
//   public int JJTLITERAL = 40;
//   public int JJTREFVARIABLE = 41;
//   public int JJTARRAYINDEX = 42;
//   public int JJTCALLCOMMAND = 43;
//   public int JJTCOMMANDARGUMENTLIST = 44;
// 
// 
//   public String[] jjtNodeName = {
//     "RootNode",
//     "void",
//     "VariableDeclaration",
//     "VariableInitializer",
//     "PrimitiveInititalizer",
//     "ArrayInitializer",
//     "CallbackDeclaration",
//     "CallbackArgumentList",
//     "UserFunctionDeclaration",
//     "Block",
//     "PreProcessorDefine",
//     "PreProcessorUnDefine",
//     "PreProcessorIfDefined",
//     "PreProcessorIfUnDefined",
//     "IfStatement",
//     "SelectStatement",
//     "CaseStatement",
//     "CaseCondition",
//     "WhileStatement",
//     "CallUserFunctionStatement",
//     "Assignment",
//     "ConditionalOr",
//     "ConditionalAnd",
//     "StrAdd",
//     "BitwiseOr",
//     "BitwiseAnd",
//     "Equal",
//     "NotEqual",
//     "LT",
//     "GT",
//     "LE",
//     "GE",
//     "Add",
//     "Sub",
//     "Mul",
//     "Div",
//     "Mod",
//     "Neg",
//     "Not",
//     "LogicalNot",
//     "Literal",
//     "RefVariable",
//     "ArrayIndex",
//     "CallCommand",
//     "CommandArgumentList",
//   };
// }


import net.rkoubou.kspparser.analyzer.SymbolDefinition.SymbolType;
import net.rkoubou.kspparser.javacc.generated.ASTPreProcessorDefine;
import net.rkoubou.kspparser.javacc.generated.ASTPreProcessorUnDefine;
import net.rkoubou.kspparser.javacc.generated.KSPParserTreeConstants;
     */
    @Override
    public boolean add( ASTPreProcessorDefine decl )
    {
        return add( new PreProcessorSymbol( decl ) );
    }

    /**
     * プリプロセッサシンボルテーブルへの追加
     */
    public boolean add( PreProcessorSymbol c )
    {
        final String name = c.getName();
        if( table.containsKey( name ) )
        {
            return false;
        }

        c.index = index;
        index++;
        c.symbolType = SymbolType.UserFunction;
        table.put( name, c );
        return true;
    }

    /**
     * UNDEFによるプリプロセッサシンボルテーブルからの除去
     */
    public boolean remove( ASTPreProcessorUnDefine undef )
    {
// Path: src/java/net/rkoubou/kspparser/analyzer/SymbolDefinition.java
// public enum SymbolType
// {
//     Unknown,
//     Callback,
//     Command,
//     UserFunction,
//     Variable,
//     Literal,
//     Expression,
//     PreprocessorSymbol,
// };
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/ASTPreProcessorDefine.java
// public
// class ASTPreProcessorDefine extends SimpleNode {
//   public ASTPreProcessorDefine(int id) {
//     super(id);
//   }
// 
//   public ASTPreProcessorDefine(KSPParser p, int id) {
//     super(p, id);
//   }
// 
// 
//   /** Accept the visitor. **/
//   public Object jjtAccept(KSPParserVisitor visitor, Object data) {
// 
//     return
//     visitor.visit(this, data);
//   }
// }
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/ASTPreProcessorUnDefine.java
// public
// class ASTPreProcessorUnDefine extends SimpleNode {
//   public ASTPreProcessorUnDefine(int id) {
//     super(id);
//   }
// 
//   public ASTPreProcessorUnDefine(KSPParser p, int id) {
//     super(p, id);
//   }
// 
// 
//   /** Accept the visitor. **/
//   public Object jjtAccept(KSPParserVisitor visitor, Object data) {
// 
//     return
//     visitor.visit(this, data);
//   }
// }
// 
// Path: src/java/net/rkoubou/kspparser/javacc/generated/KSPParserTreeConstants.java
// public interface KSPParserTreeConstants
// {
//   public int JJTROOTNODE = 0;
//   public int JJTVOID = 1;
//   public int JJTVARIABLEDECLARATION = 2;
//   public int JJTVARIABLEINITIALIZER = 3;
//   public int JJTPRIMITIVEINITITALIZER = 4;
//   public int JJTARRAYINITIALIZER = 5;
//   public int JJTCALLBACKDECLARATION = 6;
//   public int JJTCALLBACKARGUMENTLIST = 7;
//   public int JJTUSERFUNCTIONDECLARATION = 8;
//   public int JJTBLOCK = 9;
//   public int JJTPREPROCESSORDEFINE = 10;
//   public int JJTPREPROCESSORUNDEFINE = 11;
//   public int JJTPREPROCESSORIFDEFINED = 12;
//   public int JJTPREPROCESSORIFUNDEFINED = 13;
//   public int JJTIFSTATEMENT = 14;
//   public int JJTSELECTSTATEMENT = 15;
//   public int JJTCASESTATEMENT = 16;
//   public int JJTCASECONDITION = 17;
//   public int JJTWHILESTATEMENT = 18;
//   public int JJTCALLUSERFUNCTIONSTATEMENT = 19;
//   public int JJTASSIGNMENT = 20;
//   public int JJTCONDITIONALOR = 21;
//   public int JJTCONDITIONALAND = 22;
//   public int JJTSTRADD = 23;
//   public int JJTBITWISEOR = 24;
//   public int JJTBITWISEAND = 25;
//   public int JJTEQUAL = 26;
//   public int JJTNOTEQUAL = 27;
//   public int JJTLT = 28;
//   public int JJTGT = 29;
//   public int JJTLE = 30;
//   public int JJTGE = 31;
//   public int JJTADD = 32;
//   public int JJTSUB = 33;
//   public int JJTMUL = 34;
//   public int JJTDIV = 35;
//   public int JJTMOD = 36;
//   public int JJTNEG = 37;
//   public int JJTNOT = 38;
//   public int JJTLOGICALNOT = 39;
//   public int JJTLITERAL = 40;
//   public int JJTREFVARIABLE = 41;
//   public int JJTARRAYINDEX = 42;
//   public int JJTCALLCOMMAND = 43;
//   public int JJTCOMMANDARGUMENTLIST = 44;
// 
// 
//   public String[] jjtNodeName = {
//     "RootNode",
//     "void",
//     "VariableDeclaration",
//     "VariableInitializer",
//     "PrimitiveInititalizer",
//     "ArrayInitializer",
//     "CallbackDeclaration",
//     "CallbackArgumentList",
//     "UserFunctionDeclaration",
//     "Block",
//     "PreProcessorDefine",
//     "PreProcessorUnDefine",
//     "PreProcessorIfDefined",
//     "PreProcessorIfUnDefined",
//     "IfStatement",
//     "SelectStatement",
//     "CaseStatement",
//     "CaseCondition",
//     "WhileStatement",
//     "CallUserFunctionStatement",
//     "Assignment",
//     "ConditionalOr",
//     "ConditionalAnd",
//     "StrAdd",
//     "BitwiseOr",
//     "BitwiseAnd",
//     "Equal",
//     "NotEqual",
//     "LT",
//     "GT",
//     "LE",
//     "GE",
//     "Add",
//     "Sub",
//     "Mul",
//     "Div",
//     "Mod",
//     "Neg",
//     "Not",
//     "LogicalNot",
//     "Literal",
//     "RefVariable",
//     "ArrayIndex",
//     "CallCommand",
//     "CommandArgumentList",
//   };
// }


// Path: src/java/net/rkoubou/kspparser/analyzer/PreProcessorSymbolTable.java
import net.rkoubou.kspparser.analyzer.SymbolDefinition.SymbolType;
import net.rkoubou.kspparser.javacc.generated.ASTPreProcessorDefine;
import net.rkoubou.kspparser.javacc.generated.ASTPreProcessorUnDefine;
import net.rkoubou.kspparser.javacc.generated.KSPParserTreeConstants;

     */
    @Override
    public boolean add( ASTPreProcessorDefine decl )
    {
        return add( new PreProcessorSymbol( decl ) );
    }

    /**
     * プリプロセッサシンボルテーブルへの追加
     */
    public boolean add( PreProcessorSymbol c )
    {
        final String name = c.getName();
        if( table.containsKey( name ) )
        {
            return false;
        }

        c.index = index;
        index++;
        c.symbolType = SymbolType.UserFunction;
        table.put( name, c );
        return true;
    }

    /**
     * UNDEFによるプリプロセッサシンボルテーブルからの除去
     */
    public boolean remove( ASTPreProcessorUnDefine undef )
    {
        ASTPreProcessorDefine d = new ASTPreProcessorDefine( JJTPREPROCESSORDEFINE );