diff --git a/Canon.Core/Abstractions/IGrammarParser.cs b/Canon.Core/Abstractions/IGrammarParser.cs
index a86e769..44e3649 100644
--- a/Canon.Core/Abstractions/IGrammarParser.cs
+++ b/Canon.Core/Abstractions/IGrammarParser.cs
@@ -36,7 +36,21 @@ public interface IGrammarParser
         {
             AnalyseState top = stack.Peek();
 
-            // 首先尝试进行归约
+            // 首先尝试进行移进
+            if (top.State.ShiftTable.TryGetValue(enumerator.Current, out ITransformer? next))
+            {
+                stack.Push(new AnalyseState(next, SyntaxNodeBase.Create(enumerator.Current)));
+                if (enumerator.MoveNext())
+                {
+                    continue;
+                }
+                else
+                {
+                    throw new GrammarException(stack.Peek().State);
+                }
+            }
+
+            // 再进行归约
             if (top.State.ReduceTable.TryGetValue(enumerator.Current, out ReduceInformation? information))
             {
                 if (information.Left == Begin)
@@ -60,20 +74,6 @@ public interface IGrammarParser
                 continue;
             }
 
-            // 如果没有成功归约就进行移进
-            if (top.State.ShiftTable.TryGetValue(enumerator.Current, out ITransformer? next))
-            {
-                stack.Push(new AnalyseState(next, SyntaxNodeBase.Create(enumerator.Current)));
-                if (enumerator.MoveNext())
-                {
-                    continue;
-                }
-                else
-                {
-                    throw new GrammarException(stack.Peek().State);
-                }
-            }
-
             throw new GrammarException(stack.Peek().State, enumerator.Current);
         }
     }
diff --git a/Canon.Core/SemanticParser/CodeGeneratorVisitor.cs b/Canon.Core/SemanticParser/CodeGeneratorVisitor.cs
index a7c8dd9..be2e3da 100644
--- a/Canon.Core/SemanticParser/CodeGeneratorVisitor.cs
+++ b/Canon.Core/SemanticParser/CodeGeneratorVisitor.cs
@@ -3,6 +3,7 @@ using Canon.Core.CodeGenerators;
 using Canon.Core.Enums;
 using Canon.Core.LexicalParser;
 using Canon.Core.SyntaxNodes;
+using BasicType = Canon.Core.Enums.BasicType;
 
 namespace Canon.Core.SemanticParser;
 
@@ -272,7 +273,9 @@ public class CodeGeneratorVisitor : TypeCheckVisitor
         // 虽然这里这样可能会生成来类似于 &*x 的代码
         // 但是可以正常运行
         variable.VariableName =
-            symbol.Reference ? $"*{variable.Identifier.IdentifierName}" : variable.Identifier.IdentifierName;
+            symbol.SymbolType.IsReference
+                ? $"*{variable.Identifier.IdentifierName}"
+                : variable.Identifier.IdentifierName;
     }
 
     public override void PreVisit(Term term)
@@ -608,8 +611,7 @@ public class CodeGeneratorVisitor : TypeCheckVisitor
 
             if (parameter.ParameterType is PascalBasicType)
             {
-                string refValue = parameter.IsVar ? "*" : string.Empty;
-                value = $"{GenerateBasicTypeString(parameter.ParameterType)} {refValue}{parameter.ParameterName}";
+                value = $"{GenerateBasicTypeString(parameter.ParameterType)} {parameter.ParameterName}";
             }
 
             if (parameter.ParameterType is PascalArrayType)
@@ -793,24 +795,9 @@ public class CodeGeneratorVisitor : TypeCheckVisitor
         foreach ((Expression parameter, PascalParameterType parameterType) in
                  parameters.Zip(functionType.Parameters))
         {
-            if (parameterType.IsVar)
+            if (parameterType.ParameterType.IsReference)
             {
-                // 这里需要判断parameter是否也为引用类型
-                if (SymbolTable.TryGetSymbol(parameter.VariableName, out Symbol? parameterSymboe))
-                {
-                    if (parameterSymboe.Reference)
-                    {
-                        parameterValue += $", {parameter.VariableName}";
-                    }
-                    else
-                    {
-                        parameterValue += $", &{parameter.VariableName}";
-                    }
-                }
-                else
-                {
-                    parameterValue += $", &{parameter.VariableName}";
-                }
+                parameterValue += $", &{parameter.VariableName}";
             }
             else
             {
@@ -851,29 +838,21 @@ public class CodeGeneratorVisitor : TypeCheckVisitor
 
     private static string GenerateBasicTypeString(PascalType pascalType)
     {
-        if (pascalType == PascalBasicType.Character)
+        if (pascalType is not PascalBasicType basicType)
         {
-            return "char";
+            return string.Empty;
         }
 
-        if (pascalType == PascalBasicType.Boolean)
+        switch (basicType.Type)
         {
-            return "bool";
-        }
-
-        if (pascalType == PascalBasicType.Integer)
-        {
-            return "int";
-        }
-
-        if (pascalType == PascalBasicType.Real)
-        {
-            return "double";
-        }
-
-        if (pascalType == PascalBasicType.Void)
-        {
-            return "void";
+            case BasicType.Integer:
+                return basicType.IsReference ? "int *" : "int";
+            case BasicType.Real:
+                return basicType.IsReference ? "double *" : "double";
+            case BasicType.Character:
+                return basicType.IsReference ? "char *" : "char";
+            case BasicType.Boolean:
+                return basicType.IsReference ? "bool *" : "bool";
         }
 
         return string.Empty;
diff --git a/Canon.Core/SemanticParser/PascalArrayType.cs b/Canon.Core/SemanticParser/PascalArrayType.cs
index 4740761..ea0634c 100644
--- a/Canon.Core/SemanticParser/PascalArrayType.cs
+++ b/Canon.Core/SemanticParser/PascalArrayType.cs
@@ -10,6 +10,11 @@ public class PascalArrayType(PascalType elementType, int begin, int end) : Pasca
 
     public override string TypeName => $"{ElementType.TypeName}_{Begin}_{End}";
 
+    public override PascalType ToReferenceType()
+    {
+        throw new InvalidOperationException("Array type can not be reference.");
+    }
+
     public override bool Equals(PascalType? other)
     {
         if (other is not PascalArrayType pascalArrayType)
@@ -27,12 +32,13 @@ public class PascalArrayType(PascalType elementType, int begin, int end) : Pasca
             return false;
         }
 
-        return true;
+        return base.Equals(pascalArrayType);
     }
 
     public override int GetHashCode()
     {
-        return ElementType.GetHashCode()
+        return base.GetHashCode()
+               ^ ElementType.GetHashCode()
                ^ Begin.GetHashCode()
                ^ End.GetHashCode();
     }
diff --git a/Canon.Core/SemanticParser/PascalBasicType.cs b/Canon.Core/SemanticParser/PascalBasicType.cs
index fc2f57e..62c9a19 100644
--- a/Canon.Core/SemanticParser/PascalBasicType.cs
+++ b/Canon.Core/SemanticParser/PascalBasicType.cs
@@ -12,12 +12,16 @@ public class PascalBasicType : PascalType
     /// 
     public BasicType Type { get; }
 
-    public override string TypeName { get; }
+    public override string TypeName => Type.ToString();
 
-    private PascalBasicType(BasicType basicType, string typeName)
+    private PascalBasicType(BasicType type)
     {
-        Type = basicType;
-        TypeName = typeName;
+        Type = type;
+    }
+
+    public override PascalType ToReferenceType()
+    {
+        return new PascalBasicType(Type) { IsReference = true };
     }
 
     public override bool Equals(PascalType? other)
@@ -27,12 +31,12 @@ public class PascalBasicType : PascalType
             return false;
         }
 
-        return Type == pascalBasicType.Type;
+        return Type == pascalBasicType.Type && base.Equals(pascalBasicType);
     }
 
     public override int GetHashCode()
     {
-        return Type.GetHashCode();
+        return base.GetHashCode() ^ Type.GetHashCode();
     }
 
     public override string ToString() => TypeName;
@@ -40,25 +44,25 @@ public class PascalBasicType : PascalType
     /// 
     /// 整数类型的单例对象
     /// 
-    public static PascalType Integer => new PascalBasicType(BasicType.Integer, "integer");
+    public static PascalType Integer => new PascalBasicType(BasicType.Integer);
 
     /// 
     /// 布尔类型的单例对象
     /// 
-    public static PascalType Boolean => new PascalBasicType(BasicType.Boolean, "boolean");
+    public static PascalType Boolean => new PascalBasicType(BasicType.Boolean);
 
     /// 
     /// 字符类型的单例对象
     /// 
-    public static PascalType Character => new PascalBasicType(BasicType.Character, "char");
+    public static PascalType Character => new PascalBasicType(BasicType.Character);
 
     /// 
     /// 浮点数类型的单例对象
     /// 
-    public static PascalType Real => new PascalBasicType(BasicType.Real, "real");
+    public static PascalType Real => new PascalBasicType(BasicType.Real);
 
     /// 
     /// 空类型的单例对象
     /// 
-    public static PascalType Void => new PascalBasicType(BasicType.Void, "void");
+    public static PascalType Void => new PascalBasicType(BasicType.Void);
 }
diff --git a/Canon.Core/SemanticParser/PascalFunctionType.cs b/Canon.Core/SemanticParser/PascalFunctionType.cs
index 5d8719e..310f160 100644
--- a/Canon.Core/SemanticParser/PascalFunctionType.cs
+++ b/Canon.Core/SemanticParser/PascalFunctionType.cs
@@ -29,6 +29,11 @@ public class PascalFunctionType(List parameters, PascalType
         }
     }
 
+    public override PascalType ToReferenceType()
+    {
+        throw new InvalidOperationException("Function type can not be reference.");
+    }
+
     public override bool Equals(PascalType? other)
     {
         if (other is not PascalFunctionType functionType)
@@ -49,12 +54,12 @@ public class PascalFunctionType(List parameters, PascalType
             }
         }
 
-        return true;
+        return base.Equals(functionType);
     }
 
     public override int GetHashCode()
     {
-        int code = ReturnType.GetHashCode();
+        int code = base.GetHashCode() ^ ReturnType.GetHashCode();
 
         foreach (PascalParameterType parameter in Parameters)
         {
diff --git a/Canon.Core/SemanticParser/PascalParameterType.cs b/Canon.Core/SemanticParser/PascalParameterType.cs
index 4826945..7a4c137 100644
--- a/Canon.Core/SemanticParser/PascalParameterType.cs
+++ b/Canon.Core/SemanticParser/PascalParameterType.cs
@@ -1,26 +1,16 @@
 namespace Canon.Core.SemanticParser;
 
-public class PascalParameterType(PascalType parameterType, bool isVar, string parameterName) : PascalType
+public class PascalParameterType(PascalType parameterType, string parameterName) : PascalType
 {
     public PascalType ParameterType { get; } = parameterType;
 
-    public bool IsVar { get; } = isVar;
-
     public string ParameterName { get; } = parameterName;
 
-    public override string TypeName
+    public override string TypeName => $"{ParameterType}_{ParameterName}";
+
+    public override PascalType ToReferenceType()
     {
-        get
-        {
-            if (IsVar)
-            {
-                return $"var_{ParameterType.TypeName}";
-            }
-            else
-            {
-                return ParameterType.TypeName;
-            }
-        }
+        throw new InvalidOperationException("The parameter type can not be reference.");
     }
 
     public override bool Equals(PascalType? other)
@@ -30,11 +20,11 @@ public class PascalParameterType(PascalType parameterType, bool isVar, string pa
             return false;
         }
 
-        return ParameterType == parameterType.ParameterType && IsVar == parameterType.IsVar;
+        return ParameterType == parameterType.ParameterType && base.Equals(parameterType);
     }
 
     public override int GetHashCode()
     {
-        return ParameterType.GetHashCode() ^ IsVar.GetHashCode();
+        return base.GetHashCode() ^ ParameterType.GetHashCode();
     }
 }
diff --git a/Canon.Core/SemanticParser/PascalType.cs b/Canon.Core/SemanticParser/PascalType.cs
index 55cf514..bf181fb 100644
--- a/Canon.Core/SemanticParser/PascalType.cs
+++ b/Canon.Core/SemanticParser/PascalType.cs
@@ -1,4 +1,6 @@
-namespace Canon.Core.SemanticParser;
+using Canon.Core.Enums;
+
+namespace Canon.Core.SemanticParser;
 
 /// 
 /// Pascal类型基类
@@ -10,6 +12,18 @@ public abstract class PascalType : IEquatable
     /// 
     public abstract string TypeName { get; }
 
+    /// 
+    /// 将当前类型转换为引用类型
+    /// 原有类型变量保持不变
+    /// 
+    /// 原有Pascal类型的引用类型
+    public abstract PascalType ToReferenceType();
+
+    /// 
+    /// 是否为引用类型
+    /// 
+    public bool IsReference { get; init; }
+
     public virtual bool Equals(PascalType? other)
     {
         if (other is null)
@@ -17,7 +31,7 @@ public abstract class PascalType : IEquatable
             return false;
         }
 
-        return TypeName == other.TypeName;
+        return IsReference == other.IsReference;
     }
 
     public T Convert() where T : PascalType
@@ -42,7 +56,7 @@ public abstract class PascalType : IEquatable
 
     public override int GetHashCode()
     {
-        return TypeName.GetHashCode();
+        return IsReference.GetHashCode();
     }
 
     public static bool operator ==(PascalType a, PascalType b)
@@ -57,34 +71,21 @@ public abstract class PascalType : IEquatable
 
     public static PascalType operator +(PascalType a, PascalType b)
     {
-        if (!IsCalculatable(a) || !IsCalculatable(b))
-        {
-            throw new InvalidOperationException();
-        }
-
-        if (a == PascalBasicType.Boolean && b == PascalBasicType.Boolean)
+        if (a is PascalBasicType { Type: BasicType.Boolean } && b is PascalBasicType { Type: BasicType.Boolean })
         {
             return PascalBasicType.Boolean;
         }
 
-        if (a == PascalBasicType.Integer && b == PascalBasicType.Integer)
+        if (a is PascalBasicType { Type: BasicType.Integer } && b is PascalBasicType { Type: BasicType.Integer })
         {
             return PascalBasicType.Integer;
         }
-        else
+
+        if (a is PascalBasicType { Type : BasicType.Real } && b is PascalBasicType { Type: BasicType.Real })
         {
             return PascalBasicType.Real;
         }
-    }
 
-    /// 
-    /// 是否为可计算的类型
-    /// 
-    /// 需要判断的Pascal类型
-    /// 是否为可计算的类型
-    public static bool IsCalculatable(PascalType pascalType)
-    {
-        return pascalType == PascalBasicType.Integer || pascalType == PascalBasicType.Real
-                                                     || pascalType == PascalBasicType.Boolean;
+        return PascalBasicType.Void;
     }
 }
diff --git a/Canon.Core/SemanticParser/Symbol.cs b/Canon.Core/SemanticParser/Symbol.cs
index 7b8e212..8ff0114 100644
--- a/Canon.Core/SemanticParser/Symbol.cs
+++ b/Canon.Core/SemanticParser/Symbol.cs
@@ -20,11 +20,6 @@ public class Symbol : IEquatable
     /// 
     public bool Const { get; init; }
 
-    /// 
-    /// 是否为引用变量
-    /// 
-    public bool Reference { get; init; }
-
     public bool Equals(Symbol? other)
     {
         if (other is null)
@@ -33,9 +28,8 @@ public class Symbol : IEquatable
         }
 
         return SymbolName == other.SymbolName
-               && SymbolType == other.SymbolType
-               && Const == other.Const
-               && Reference == other.Reference;
+            && SymbolType == other.SymbolType
+            && Const == other.Const;
     }
 
     public override int GetHashCode()
@@ -53,6 +47,3 @@ public class Symbol : IEquatable
         return Equals(other);
     }
 }
-
-
-
diff --git a/Canon.Core/SemanticParser/TypeCheckVisitor.cs b/Canon.Core/SemanticParser/TypeCheckVisitor.cs
index 901e4c8..4770f41 100644
--- a/Canon.Core/SemanticParser/TypeCheckVisitor.cs
+++ b/Canon.Core/SemanticParser/TypeCheckVisitor.cs
@@ -69,7 +69,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
 
         if (!SymbolTable.TryAddSymbol(new Symbol
             {
-                Const = true, SymbolName = token.IdentifierName, SymbolType = constValue.ConstType
+                SymbolName = token.IdentifierName, SymbolType = constValue.ConstType, Const = true
             }))
         {
             IsError = true;
@@ -96,23 +96,14 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
         };
 
         // factor -> true | false
-        factor.OnBooleanGenerator += (_, _) =>
-        {
-            factor.VariableType = PascalBasicType.Boolean;
-        };
+        factor.OnBooleanGenerator += (_, _) => { factor.VariableType = PascalBasicType.Boolean; };
 
         // factor -> variable
-        factor.OnVariableGenerator += (_, e) =>
-        {
-            factor.VariableType = e.Variable.VariableType;
-        };
+        factor.OnVariableGenerator += (_, e) => { factor.VariableType = e.Variable.VariableType; };
 
 
         // factor -> (expression)
-        factor.OnParethnesisGenerator += (_, e) =>
-        {
-            factor.VariableType = e.Expression.VariableType;
-        };
+        factor.OnParethnesisGenerator += (_, e) => { factor.VariableType = e.Expression.VariableType; };
 
         // factor -> id ( ExpressionList)
         factor.OnProcedureCallGenerator += (_, e) =>
@@ -135,43 +126,30 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
         };
 
         // factor -> not factor
-        factor.OnNotGenerator += (_, e) =>
-        {
-            factor.VariableType = e.Factor.VariableType;
-        };
+        factor.OnNotGenerator += (_, e) => { factor.VariableType = e.Factor.VariableType; };
 
         // factor -> uminus factor
-        factor.OnUminusGenerator += (_, e) =>
-        {
-            factor.VariableType = e.Factor.VariableType;
-        };
+        factor.OnUminusGenerator += (_, e) => { factor.VariableType = e.Factor.VariableType; };
 
         // factor -> plus factor
-        factor.OnPlusGenerator += (_, e) =>
-        {
-            factor.VariableType = e.Factor.VariableType;
-        };
+        factor.OnPlusGenerator += (_, e) => { factor.VariableType = e.Factor.VariableType; };
     }
 
     public override void PostVisit(Term term)
     {
         base.PostVisit(term);
 
-        term.OnFactorGenerator += (_, e) =>
-        {
-            term.VariableType = e.Factor.VariableType;
-        };
+        term.OnFactorGenerator += (_, e) => { term.VariableType = e.Factor.VariableType; };
 
         term.OnMultiplyGenerator += (_, e) =>
         {
-            if (PascalType.IsCalculatable(e.Left.VariableType) && PascalType.IsCalculatable(e.Right.VariableType))
-            {
-                term.VariableType = e.Left.VariableType + e.Right.VariableType;
-                return;
-            }
+            term.VariableType = e.Left.VariableType + e.Right.VariableType;
 
-            IsError = true;
-            logger?.LogError("Can't calculate");
+            if (term.VariableType == PascalBasicType.Void)
+            {
+                IsError = true;
+                logger?.LogError("Can't calculate");
+            }
         };
     }
 
@@ -179,21 +157,17 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
     {
         base.PostVisit(simpleExpression);
 
-        simpleExpression.OnTermGenerator += (_, e) =>
-        {
-            simpleExpression.VariableType = e.Term.VariableType;
-        };
+        simpleExpression.OnTermGenerator += (_, e) => { simpleExpression.VariableType = e.Term.VariableType; };
 
         simpleExpression.OnAddGenerator += (_, e) =>
         {
-            if (PascalType.IsCalculatable(e.Left.VariableType) && PascalType.IsCalculatable(e.Right.VariableType))
-            {
-                simpleExpression.VariableType = e.Left.VariableType + e.Right.VariableType;
-                return;
-            }
+            simpleExpression.VariableType = e.Left.VariableType + e.Right.VariableType;
 
-            IsError = true;
-            logger?.LogError("Can't calculate");
+            if (simpleExpression.VariableType == PascalBasicType.Void)
+            {
+                IsError = true;
+                logger?.LogError("Can't calculate");
+            }
         };
     }
 
@@ -206,10 +180,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
             expression.VariableType = e.SimpleExpression.VariableType;
         };
 
-        expression.OnRelationGenerator += (_, _) =>
-        {
-            expression.VariableType = PascalBasicType.Boolean;
-        };
+        expression.OnRelationGenerator += (_, _) => { expression.VariableType = PascalBasicType.Boolean; };
     }
 
     public override void PostVisit(TypeSyntaxNode typeSyntaxNode)
@@ -251,7 +222,12 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
     {
         base.PostVisit(identifierList);
 
-        identifierList.OnTypeGenerator += (_, e) => { identifierList.DefinitionType = e.TypeSyntaxNode.PascalType; };
+        identifierList.OnTypeGenerator += (_, e) =>
+        {
+            identifierList.DefinitionType = identifierList.IsReference
+                ? e.TypeSyntaxNode.PascalType.ToReferenceType()
+                : e.TypeSyntaxNode.PascalType;
+        };
 
         identifierList.OnIdentifierGenerator += (_, e) =>
         {
@@ -259,9 +235,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
 
             Symbol symbol = new()
             {
-                SymbolName = e.IdentifierToken.IdentifierName,
-                SymbolType = identifierList.DefinitionType,
-                Reference = identifierList.IsReference
+                SymbolName = e.IdentifierToken.IdentifierName, SymbolType = identifierList.DefinitionType,
             };
             SymbolTable.TryAddSymbol(symbol);
 
@@ -342,7 +316,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
         {
             foreach (Symbol symbol in children.AsEnumerable().Reverse())
             {
-                parameters.Add(new PascalParameterType(symbol.SymbolType, symbol.Reference, symbol.SymbolName));
+                parameters.Add(new PascalParameterType(symbol.SymbolType, symbol.SymbolName));
             }
         }
 
@@ -398,8 +372,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
         Symbol symbol = new()
         {
             SymbolName = valueParameter.Token.IdentifierName,
-            SymbolType = valueParameter.IdentifierList.DefinitionType,
-            Reference = valueParameter.IsReference
+            SymbolType = valueParameter.IdentifierList.DefinitionType
         };
         SymbolTable.TryAddSymbol(symbol);
 
diff --git a/Canon.Core/SyntaxNodes/TypeSyntaxNode.cs b/Canon.Core/SyntaxNodes/TypeSyntaxNode.cs
index 948e1cc..1011fd4 100644
--- a/Canon.Core/SyntaxNodes/TypeSyntaxNode.cs
+++ b/Canon.Core/SyntaxNodes/TypeSyntaxNode.cs
@@ -59,6 +59,11 @@ public class TypeSyntaxNode : NonTerminatedSyntaxNode
         }
     }
 
+    /// 
+    /// 是否为定义引用变量
+    /// 
+    public bool IsReference { get; set; }
+
     public static TypeSyntaxNode Create(List children)
     {
         return new TypeSyntaxNode { Children = children };
diff --git a/Canon.Tests/SemanticTests/PascalTypeTests.cs b/Canon.Tests/SemanticTests/PascalTypeTests.cs
index c38371a..d32ddb1 100644
--- a/Canon.Tests/SemanticTests/PascalTypeTests.cs
+++ b/Canon.Tests/SemanticTests/PascalTypeTests.cs
@@ -36,14 +36,14 @@ public class PascalTypeTests
     [Fact]
     public void PascalFunctionTypeTests()
     {
-        PascalType function1 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Integer, false, "a")],
+        PascalType function1 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Integer, "a")],
             PascalBasicType.Void);
-        PascalType function2 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Integer, false, "a")],
+        PascalType function2 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Integer, "a")],
             PascalBasicType.Void);
 
         Assert.Equal(function1, function2);
 
-        PascalType function3 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Real, true, "a")],
+        PascalType function3 = new PascalFunctionType([new PascalParameterType(PascalBasicType.Real, "a")],
             PascalBasicType.Integer);
         Assert.NotEqual(function1, function3);
     }
diff --git a/Canon.Tests/SemanticTests/SymbolTableTests.cs b/Canon.Tests/SemanticTests/SymbolTableTests.cs
index d2f59d0..af8ab8b 100644
--- a/Canon.Tests/SemanticTests/SymbolTableTests.cs
+++ b/Canon.Tests/SemanticTests/SymbolTableTests.cs
@@ -9,13 +9,13 @@ public class SymbolTableTests
     {
         SymbolTable table = new();
 
-        Assert.True(table.TryGetType("integer", out PascalType? integer));
+        Assert.True(table.TryGetType("Integer", out PascalType? integer));
         Assert.Equal(PascalBasicType.Integer, integer);
-        Assert.True(table.TryGetType("real", out PascalType? real));
+        Assert.True(table.TryGetType("Real", out PascalType? real));
         Assert.Equal(PascalBasicType.Real, real);
-        Assert.True(table.TryGetType("boolean", out PascalType? boolean));
+        Assert.True(table.TryGetType("Boolean", out PascalType? boolean));
         Assert.Equal(PascalBasicType.Boolean, boolean);
-        Assert.True(table.TryGetType("char", out PascalType? character));
+        Assert.True(table.TryGetType("Character", out PascalType? character));
         Assert.Equal(PascalBasicType.Character, character);
     }
 
@@ -25,10 +25,7 @@ public class SymbolTableTests
         SymbolTable table = new();
 
         Assert.True(table.TryAddSymbol(new Symbol { SymbolName = "a", SymbolType = PascalBasicType.Integer }));
-        Assert.True(table.TryAddSymbol(new Symbol
-        {
-            SymbolName = "temperature", SymbolType = PascalBasicType.Real, Const = true
-        }));
+        Assert.True(table.TryAddSymbol(new Symbol { SymbolName = "temperature", SymbolType = PascalBasicType.Real }));
 
         Assert.True(table.TryGetSymbol("a", out Symbol? a));
         Assert.Equal(PascalBasicType.Integer, a.SymbolType);
@@ -42,18 +39,12 @@ public class SymbolTableTests
         SymbolTable table = new();
 
         Assert.True(table.TryAddSymbol(new Symbol { SymbolName = "a", SymbolType = PascalBasicType.Integer }));
-        Assert.True(table.TryAddSymbol(new Symbol
-        {
-            SymbolName = "temperature", SymbolType = PascalBasicType.Real, Const = true
-        }));
+        Assert.True(table.TryAddSymbol(new Symbol { SymbolName = "temperature", SymbolType = PascalBasicType.Real }));
 
         SymbolTable child = table.CreateChildTable();
 
-        Assert.True(child.TryAddSymbol(new Symbol{SymbolName = "a", SymbolType = PascalBasicType.Real}));
-        Assert.True(child.TryAddSymbol(new Symbol
-        {
-            SymbolName = "level2", SymbolType = PascalBasicType.Boolean, Reference = true
-        }));
+        Assert.True(child.TryAddSymbol(new Symbol { SymbolName = "a", SymbolType = PascalBasicType.Real }));
+        Assert.True(child.TryAddSymbol(new Symbol { SymbolName = "level2", SymbolType = PascalBasicType.Boolean }));
 
         Assert.True(child.TryGetSymbol("a", out Symbol? a));
         Assert.Equal(PascalBasicType.Real, a.SymbolType);
diff --git a/Canon.Tests/SemanticTests/TypeCheckVisitorTests.cs b/Canon.Tests/SemanticTests/TypeCheckVisitorTests.cs
index 9afda2b..66faf99 100644
--- a/Canon.Tests/SemanticTests/TypeCheckVisitorTests.cs
+++ b/Canon.Tests/SemanticTests/TypeCheckVisitorTests.cs
@@ -126,9 +126,9 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test", out Symbol? symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Integer, false, "a")
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Integer, "a")
         ], PascalBasicType.Void));
     }
 
@@ -148,9 +148,9 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test", out Symbol? symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Real, true, "a"),
-            new PascalParameterType(PascalBasicType.Real, true, "a"),
-            new PascalParameterType(PascalBasicType.Real, true, "a")
+            new PascalParameterType(PascalBasicType.Real.ToReferenceType(),"a"),
+            new PascalParameterType(PascalBasicType.Real.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Real.ToReferenceType(), "a")
         ], PascalBasicType.Void));
     }
 
@@ -170,10 +170,10 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test", out Symbol? symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Character, true, "a"),
-            new PascalParameterType(PascalBasicType.Character, true, "a")
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Character.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Character.ToReferenceType(), "a")
         ], PascalBasicType.Void));
     }
 
@@ -193,10 +193,10 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test", out Symbol? symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Character, true, "a"),
-            new PascalParameterType(PascalBasicType.Character, true, "a")
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Character.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Character.ToReferenceType(), "a")
         ], PascalBasicType.Real));
     }
 
@@ -219,16 +219,16 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test1", out Symbol? symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Integer, false, "a"),
-            new PascalParameterType(PascalBasicType.Real, true, "a"),
-            new PascalParameterType(PascalBasicType.Real, true, "a"),
-            new PascalParameterType(PascalBasicType.Boolean, false, "a")
+            new PascalParameterType(PascalBasicType.Integer, "a"),
+            new PascalParameterType(PascalBasicType.Real.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Real.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Boolean, "a")
         ], PascalBasicType.Void));
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("test2", out symbol));
         Assert.Equal(symbol.SymbolType, new PascalFunctionType([
-            new PascalParameterType(PascalBasicType.Boolean, true, "a"),
-            new PascalParameterType(PascalBasicType.Boolean, true, "a")
+            new PascalParameterType(PascalBasicType.Boolean.ToReferenceType(), "a"),
+            new PascalParameterType(PascalBasicType.Boolean.ToReferenceType(), "a")
         ], PascalBasicType.Boolean));
     }
 
@@ -279,7 +279,6 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("a", out Symbol? symbol));
         Assert.Equal(PascalBasicType.Integer, symbol.SymbolType);
-        Assert.True(symbol.Const);
 
         Assert.True(visitor.SymbolTable.TryGetSymbol("b", out symbol));
         Assert.Equal(PascalBasicType.Real, symbol.SymbolType);
@@ -290,7 +289,7 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
         Assert.True(visitor.SymbolTable.TryGetSymbol("test", out symbol));
         Assert.Equal(
             new PascalFunctionType([
-                new PascalParameterType(PascalBasicType.Boolean, false, "a")
+                new PascalParameterType(PascalBasicType.Boolean, "a")
             ], PascalBasicType.Void), symbol.SymbolType);
 
         Assert.False(visitor.SymbolTable.TryGetSymbol("d", out symbol));