コード例 #1
0
ファイル: AbstractSyntax.cs プロジェクト: Nxun/Naive-Tiger
 public FieldExpressionList(Position pos, Symbol name, Expression init, FieldExpressionList tail)
 {
     Pos = pos;
     Name = name;
     Init = init;
     Tail = tail;
 }
コード例 #2
0
 public FieldExpressionList(Position pos, Symbol name, Expression init, FieldExpressionList tail)
 {
     Pos  = pos;
     Name = name;
     Init = init;
     Tail = tail;
 }
コード例 #3
0
            ExpressionType TranslateExpression(RecordExpression e)
            {
                Types.Type eType = Env.TypeEnvironment[e.Type] as Types.Type;
                if (eType == null)
                {
                    Error.Report(e.Pos, "Undefined record type " + e.Type.ToString());
                    return(new ExpressionType(null, Types.Type._int));
                }

                eType = eType.Actual;
                if (!(eType is Types.RECORD))
                {
                    Error.Report(e.Pos, "Record type required");
                    return(new ExpressionType(null, Types.Type._int));
                }

                FieldExpressionList eFields = e.Fields;

                Types.RECORD   eRecord = (Types.RECORD)eType;
                ExpressionType et;

                List <Exp> fieldList = new List <Exp>();

                for (; eFields != null; eFields = eFields.Tail, eRecord = eRecord.Tail)
                {
                    if (eRecord == null)
                    {
                        Error.Report(eFields.Pos,
                                     "Field " + eFields.Name.ToString() + " has not been declared");
                        break;
                    }
                    if (eRecord.FieldName != eFields.Name)
                    {
                        Error.Report(eFields.Pos,
                                     eRecord.FieldName.ToString() + " field dismatch");
                        break;
                    }
                    et = TranslateExpression(eFields.Init);
                    fieldList.Add(et.Exp);
                    if (!et.Type.CoerceTo(eRecord.FieldType))
                    {
                        Error.Report(eFields.Pos, "Type mismatch in record field");
                    }
                }

                if (eRecord != null)
                {
                    Error.Report(eFields.Pos, "Missing record fields");
                }
                return(new ExpressionType(Translate.TranslateRecordExp(Level, fieldList), eType));
            }
コード例 #4
0
            void PrintFieldExpressionList(FieldExpressionList f, int d)
            {
                Indent(d);
                SayLn("FieldExpressionList(");

                if (f != null)
                {
                    SayLn("");
                    Say(f.Name.ToString());
                    SayLn(",");
                    PrintExpression(f.Init, d + 1);
                    SayLn(",");
                    PrintFieldExpressionList(f.Tail, d + 1);
                }

                Say(")");
            }
コード例 #5
0
 public RecordExpression(Position pos, Symbol type, FieldExpressionList fields)
 {
     Pos = pos;
     Type = type;
     Fields = fields;
 }
コード例 #6
0
            void PrintFieldExpressionList(FieldExpressionList f, int d)
            {
                Indent(d);
                SayLn("FieldExpressionList(");

                if (f != null)
                {
                    SayLn("");
                    Say(f.Name.ToString());
                    SayLn(",");
                    PrintExpression(f.Init, d + 1);
                    SayLn(",");
                    PrintFieldExpressionList(f.Tail, d + 1);
                }

                Say(")");
            }
コード例 #7
0
ファイル: FindEscape.cs プロジェクト: signingoff/Naive-Tiger
 public void TraverseExpression(int depth, Expression exp)
 {
     if (exp == null)
     {
         return;
     }
     else if (exp is VariableExpression)
     {
         TraverseVariable(depth, (exp as VariableExpression).Var);
     }
     else if (exp is CallExpression)
     {
         for (ExpressionList el = (exp as CallExpression).Args; el != null; el = el.Tail)
         {
             TraverseExpression(depth, el.Head);
         }
     }
     else if (exp is OperatorExpression)
     {
         TraverseExpression(depth, (exp as OperatorExpression).Left);
         TraverseExpression(depth, (exp as OperatorExpression).Right);
     }
     else if (exp is RecordExpression)
     {
         for (FieldExpressionList el = (exp as RecordExpression).Fields; el != null; el = el.Tail)
         {
             TraverseExpression(depth, el.Init);
         }
     }
     else if (exp is SequenceExpression)
     {
         for (ExpressionList el = (exp as SequenceExpression).Exps; el != null; el = el.Tail)
         {
             TraverseExpression(depth, el.Head);
         }
     }
     else if (exp is AssignExpression)
     {
         TraverseVariable(depth, (exp as AssignExpression).Var);
         TraverseExpression(depth, (exp as AssignExpression).Exp);
     }
     else if (exp is IfExpression)
     {
         TraverseExpression(depth, (exp as IfExpression).Test);
         TraverseExpression(depth, (exp as IfExpression).Then);
         TraverseExpression(depth, (exp as IfExpression).Else);
     }
     else if (exp is WhileExpression)
     {
         TraverseExpression(depth, (exp as WhileExpression).Test);
         TraverseExpression(depth, (exp as WhileExpression).Body);
     }
     else if (exp is ForExpression)
     {
         TraverseDeclaration(depth, (exp as ForExpression).VarDec);
         TraverseExpression(depth, (exp as ForExpression).High);
         TraverseExpression(depth, (exp as ForExpression).Body);
     }
     else if (exp is LetExpression)
     {
         for (DeclarationList dl = (exp as LetExpression).Decs; dl != null; dl = dl.Tail)
         {
             TraverseDeclaration(depth, dl.Head);
         }
         TraverseExpression(depth, (exp as LetExpression).Body);
     }
     else if (exp is ArrayExpression)
     {
         TraverseExpression(depth, (exp as ArrayExpression).Size);
         TraverseExpression(depth, (exp as ArrayExpression).Init);
     }
 }
コード例 #8
0
 public RecordExpression(Position pos, Symbol type, FieldExpressionList fields)
 {
     Pos    = pos;
     Type   = type;
     Fields = fields;
 }