mirror of
https://github.com/SSCLI/sscli_20021101
synced 2026-06-08 12:28:57 +00:00
9fa3874800
Moved the original file to the archive subfolder.
605 lines
9.5 KiB
C#
605 lines
9.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="exp.cs" company="Microsoft">
|
|
//
|
|
// Copyright (c) 2002 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// The use and distribution terms for this software are contained in the file
|
|
// named license.txt, which can be found in the root of this distribution.
|
|
// By using this software in any fashion, you are agreeing to be bound by the
|
|
// terms of this license.
|
|
//
|
|
// You must not remove this notice, or any other, from this software.
|
|
//
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
using System;
|
|
using System.Collections;
|
|
using LexToken;
|
|
|
|
|
|
namespace Absyn {
|
|
|
|
enum Operator {
|
|
ADD = 2,
|
|
SUB = 3,
|
|
MUL = 4,
|
|
DIVIDE = 5,
|
|
LT = 6,
|
|
GT = 7,
|
|
EQ = 8,
|
|
LE = 9,
|
|
GE = 10
|
|
}
|
|
|
|
class ExpList
|
|
{
|
|
public Exp Head;
|
|
public ExpList Tail;
|
|
|
|
public override String ToString()
|
|
{
|
|
return (Head.ToString() + ((Tail != null) ? Tail.ToString() : null));
|
|
}
|
|
|
|
}
|
|
|
|
abstract class Exp
|
|
{
|
|
public Type ExpType;
|
|
|
|
public abstract void Visit(IExpVisitor v);
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract class NumericExp : Exp
|
|
{
|
|
}
|
|
|
|
abstract class BoolExp : Exp
|
|
{
|
|
}
|
|
|
|
abstract class ListExp : Exp
|
|
{
|
|
}
|
|
|
|
class BinopExp : NumericExp
|
|
{
|
|
public Exp Left, Right;
|
|
public Operator Oper;
|
|
|
|
public BinopExp(Exp l, Token op, Exp r)
|
|
{
|
|
Left = l;
|
|
Right = r;
|
|
ExpType = typeof(int);
|
|
|
|
switch(op.Type){
|
|
case TokenType.PLUS:
|
|
Oper = Operator.ADD;
|
|
break;
|
|
case TokenType.MINUS:
|
|
Oper = Operator.SUB;
|
|
break;
|
|
case TokenType.MUL:
|
|
Oper = Operator.MUL;
|
|
break;
|
|
case TokenType.DIVIDE:
|
|
Oper = Operator.DIVIDE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("BinopExp(\n" + Left.ToString() + Oper.ToString() + "\n" + Right.ToString() + "\n)" );
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.BinopExp(this);
|
|
}
|
|
}
|
|
|
|
class CompareExp : BoolExp
|
|
{
|
|
public Exp Left, Right;
|
|
public Operator Oper;
|
|
|
|
public CompareExp(Exp l, Token op, Exp r)
|
|
{
|
|
Left = l;
|
|
Right = r;
|
|
|
|
switch(op.Type){
|
|
case TokenType.LT:
|
|
Oper = Operator.LT;
|
|
break;
|
|
case TokenType.GT:
|
|
Oper = Operator.GT;
|
|
break;
|
|
case TokenType.EQ:
|
|
Oper = Operator.EQ;
|
|
break;
|
|
case TokenType.LE:
|
|
Oper = Operator.LE;
|
|
break;
|
|
case TokenType.GE:
|
|
Oper = Operator.GE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("CompareExp(\n" + Left.ToString() + Oper.ToString() + "\n" + Right.ToString() + "\n)" );
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.CompareExp(this);
|
|
}
|
|
}
|
|
|
|
|
|
class IntExp : NumericExp
|
|
{
|
|
public long Value;
|
|
|
|
public IntExp(long v)
|
|
{
|
|
Value = v;
|
|
ExpType = typeof(int);
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("IntExp(" + Value + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.IntExp(this);
|
|
}
|
|
}
|
|
|
|
class IsNullExp : BoolExp
|
|
{
|
|
public Exp Expr;
|
|
|
|
public IsNullExp(Exp e)
|
|
{
|
|
Expr = e;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("IsNullExp(\n" + Expr.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
class NilExp : ListExp
|
|
{
|
|
public override String ToString()
|
|
{
|
|
return "NilExp()\n";
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
class CdrExp : ListExp
|
|
{
|
|
public Exp Left;
|
|
|
|
public CdrExp(Exp l)
|
|
{
|
|
Left = l;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("CdrExp(\n" + Left.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
}
|
|
|
|
|
|
}
|
|
|
|
class CarExp : ListExp
|
|
{
|
|
public Exp Left;
|
|
|
|
public CarExp(Exp l)
|
|
{
|
|
Left = l;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("CarExp(\n" + Left.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.CarExp(this);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class ConsExp : ListExp
|
|
{
|
|
public Exp Left, Right;
|
|
|
|
public ConsExp(Exp l, Exp r)
|
|
{
|
|
Left = l;
|
|
Right = r;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("ConsExp(\n" + Left.ToString() + ",\n " + Right.ToString() + ")\n");
|
|
}
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
}
|
|
}
|
|
|
|
class SubstExp : ListExp
|
|
{
|
|
public Exp Replace, Find, Expr;
|
|
|
|
public SubstExp(Exp r, Exp f, Exp e)
|
|
{
|
|
Replace = r;
|
|
Find = f;
|
|
Expr = e;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("SubsExp(\n" + Replace.ToString() + ",\n" + Find.ToString() + ",\n" + Expr.ToString() + ")\n");
|
|
}
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
class StringExp : ListExp
|
|
{
|
|
public String Value;
|
|
|
|
public StringExp(String v)
|
|
{
|
|
Value = v;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("StringExp(" + Value + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.StringExp(this);
|
|
}
|
|
}
|
|
|
|
class VarExp : Exp
|
|
{
|
|
public String Name;
|
|
public int Pos;
|
|
|
|
public VarExp(String n, int p)
|
|
{
|
|
Name = n;
|
|
Pos = p;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("VarExp(" + Name + ", " + Pos + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.VarExp(this);
|
|
}
|
|
|
|
}
|
|
|
|
class GlobalVarExp : Exp
|
|
{
|
|
public String Name;
|
|
|
|
public GlobalVarExp(String n)
|
|
{
|
|
Name = n;
|
|
ExpType = typeof(int);
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("GlobalVarExp(" + Name + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.GlobalVarExp(this);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
class CallExp : Exp
|
|
{
|
|
public String ClassName;
|
|
public String FunctionName;
|
|
public Exp[] Params;
|
|
public bool System;
|
|
|
|
public CallExp(String c, String f, Exp[] p)
|
|
{
|
|
ClassName = c;
|
|
FunctionName = f;
|
|
Params = p;
|
|
System = false;
|
|
}
|
|
|
|
public CallExp(String c, String f, Exp[] p, Type t)
|
|
{
|
|
ClassName = c;
|
|
FunctionName = f;
|
|
Params = p;
|
|
System = true;
|
|
ExpType = t;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("CallExp(" + FunctionName + ", " + Params.Length + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.CallExp(this);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
class IfExp : Exp
|
|
{
|
|
public Exp EvalExp, ThenExp, ElseExp;
|
|
|
|
public IfExp(Exp e, Exp thene, Exp elsee)
|
|
{
|
|
EvalExp = e;
|
|
ThenExp = thene;
|
|
ElseExp = elsee;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("IfExp(\n" + EvalExp.ToString() + " ," + ThenExp.ToString() + " ," + ElseExp.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.IfExp(this);
|
|
}
|
|
}
|
|
|
|
|
|
class GlobalVarDef : Exp
|
|
{
|
|
public String Name;
|
|
public Exp Value;
|
|
|
|
public GlobalVarDef(String n, Exp v)
|
|
{
|
|
Name = n;
|
|
Value = v;
|
|
ExpType = Value.ExpType;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("GlobalVarDef(" + Name + ",\n" + Value.ToString() + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.GlobalVarDef(this);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class FunctionDef : Exp
|
|
{
|
|
public String Name;
|
|
public ArrayList Params;
|
|
public Exp Body;
|
|
public int Count;
|
|
|
|
|
|
public FunctionDef(String n, ArrayList p, Exp b)
|
|
{
|
|
Name = n;
|
|
Params = p;
|
|
Body = b;
|
|
Count = Params.Count;
|
|
//ExpType = Body.ExpType;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("FunctionDef( " + Name + " " + Params.Count + "\n" + Body.ToString() + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.FunctionDef(this);
|
|
}
|
|
}
|
|
|
|
|
|
class ToIntExp : NumericExp
|
|
{
|
|
public Exp Value;
|
|
|
|
public ToIntExp(Exp v)
|
|
{
|
|
Value = v;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("ToIntExp(\n" + Value.ToString() + ")");
|
|
}
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.ToIntExp(this);
|
|
}
|
|
}
|
|
|
|
class ToListExp : ListExp
|
|
{
|
|
public Exp Value;
|
|
|
|
public ToListExp(Exp v)
|
|
{
|
|
Value = v;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("ToListExp(\n" + Value.ToString() + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.ToListExp(this);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
class DoExp : Exp
|
|
{
|
|
public ExpList Vars, Conds;
|
|
|
|
public DoExp(ExpList v, ExpList c)
|
|
{
|
|
Vars = v;
|
|
Conds = c;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("DoExp(\n" + Vars.ToString() + ",\n" + Conds.ToString() + ")\n") ;
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.DoExp(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class DoVarExp : Exp
|
|
{
|
|
public String Name;
|
|
public int Pos;
|
|
|
|
public DoVarExp(String n, int p)
|
|
{
|
|
Name = n;
|
|
Pos = p;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("DoVarExp(\n" + Name + ", " + Pos.ToString() + ")");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.DoVarExp(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class DoVarDef : Exp
|
|
{
|
|
public String Name;
|
|
public Exp Init, Iter;
|
|
public int Pos;
|
|
|
|
public DoVarDef(String n, Exp init, Exp it, int p)
|
|
{
|
|
Name = n;
|
|
Init = init;
|
|
Iter = it;
|
|
Pos = p;
|
|
}
|
|
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("DoVarDef(\n" + Name + ",\n" + Init.ToString() + ",\n" + Iter.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.DoVarDef(this);
|
|
}
|
|
}
|
|
|
|
class DoCondExp : Exp
|
|
{
|
|
public Exp Cond, Ret;
|
|
public System.Reflection.Emit.Label EndLabel;
|
|
|
|
public DoCondExp(Exp c, Exp r)
|
|
{
|
|
Cond = c;
|
|
Ret = r;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return ("DoCondExp(\n" + Cond.ToString() + ",\n" + Ret.ToString() + ")\n");
|
|
}
|
|
|
|
public override void Visit(IExpVisitor v)
|
|
{
|
|
v.DoCondExp(this);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|