Example #1
0
        public override void CheckSemantic(Scope scope, List<Error> errors)
        {
            int count = errors.Count();
            Id.CheckSemantic(scope, errors);

            lval = (TigerNode)Id;
            GetLValues(Access, ref lval);

            count = errors.Count();
            lval.CheckSemantic(scope, errors);
            if (count == errors.Count())
                ReturnType = lval.ReturnType;
        }
Example #2
0
 public void GetLValues(List<Access> access,ref TigerNode l)
 {
     if (access.Count() != 0)
     {
         if (access[0] is AccessArray)
         {
             AccessArray elem_array = (AccessArray)access[0];
             access.RemoveAt(0);
             //LValueNode temp = l;
             l = new ElemArrayNode(elem_array.Index, l);
             GetLValues(access,ref l);
         }
         else
         {
             AccessRecord field_record = (AccessRecord)access[0];
             access.RemoveAt(0);
             //LValueNode temp=l;
             l = new FieldRecordNode(field_record.Field, l);
             GetLValues(access,ref l);
         }
     }
     return;
 }
Example #3
0
 public WhileNode(TigerNode exprWhile, TigerNode exprDo)
 {
     ExprWhile = exprWhile; ExprDo = exprDo;
 }
Example #4
0
 public AccessArray(TigerNode index)
 {
     Index = index;
 }
Example #5
0
 public OrNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
 public GreaterEqualThanNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #7
0
 public BinaryOpNode(TigerNode expr1, TigerNode expr2)
 {
     LeftOperand = expr1; RigthOperand = expr2;
 }
Example #8
0
 public IfThenNode(TigerNode exprIf, TigerNode exprThen)
 {
     ExprIf = exprIf; ExprThen = exprThen;
 }
Example #9
0
 public ElemArrayNode(TigerNode index, TigerNode expr)
 {
     Expr = expr; Index = index;
 }
Example #10
0
 public ArrayNode(string name, TigerNode length, TigerNode value)
 {
     Name = name; Length = length; Value = value;
 }
Example #11
0
 public ForNode(string idLoop,TigerNode exprFor, TigerNode exprTo, TigerNode exprDo)
 {
     ExprFor = exprFor; ExprTo = exprTo; ExprDo = exprDo; IdLoop = idLoop;
 }
Example #12
0
 public MinusUnaryNode(TigerNode expr)
 {
     Expr = expr;
 }
Example #13
0
 public DistinctNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #14
0
 public LogicOpNode(TigerNode expr1, TigerNode expr2)
     : base(expr1, expr2)
 {
 }
Example #15
0
 public VariableDeclNode(string id, string type, TigerNode expr)
 {
     IdVar = id; Expr = expr; IdType = type;
 }
Example #16
0
 public ArithmeticOpNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #17
0
 public VariableDeclNode(string id, TigerNode expr)
     : this(id, "", expr)
 {
 }
Example #18
0
 public IfThenElseNode(TigerNode exprIf, TigerNode exprThen, TigerNode exprElse)
 {
     ExprIf = exprIf; ExprElse = exprElse; ExprThen = exprThen;
 }
Example #19
0
 public FunctionDeclNode(string idFunction, string idType, List<Parameter> parameters, TigerNode expr)
 {
     IdFunction = idFunction; IdType = idType; Expr = expr; Parameters = parameters;
 }
Example #20
0
 public MinusNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #21
0
 public FunctionDeclNode(string idFunction, List<Parameter> parameters, TigerNode expr)
     : this(idFunction, "void", parameters, expr)
 {
 }
Example #22
0
 public RelationalOpNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #23
0
        public List<Error> Compile(string inputPath)
        {
            this.inputpath = inputPath;
            root = null;

            stream = new ANTLRFileStream(inputpath);
            lexer = new tiger_grammarLexer(stream);
            tokens = new CommonTokenStream(lexer);
            parser = new tiger_grammarParser(tokens);

            try
            {
                var result = parser.language();
                root = result;
                if (parser.Errors.Count() == 0)
                {
                    Errors.Clear();
                    Scope scope = new Scope(null);
                    scope.InitiScope();
                    root.CheckSemantic(scope, Errors);

                    if (Errors.Count() == 0)
                    {
                        GenCode(root);
                    }
                }
                else
                {
                    Errors.Clear();
                    foreach (var item in parser.Errors)
                    {
                        Errors.Add(new Error(0,0,item));
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
            return Errors;
        }
Example #24
0
 public EqualNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #25
0
        public void GenCode(TigerNode root)
        {
            Initialize();
            if (root == null) throw new Exception(" Fatal Error");
            if (Errors.Count == 0)
            {
                GeneratePredefinitedFunction();
                MethodBuilder methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes);
                asmBluider.SetEntryPoint(methodBuilder, PEFileKinds.ConsoleApplication);
                ILGenerator cg = methodBuilder.GetILGenerator();

                root.GenCode(typeBuilder, methodBuilder, cg);

                if (root is InstructionNode && root.ReturnType.BaseType.Name != "void")
                {
                    cg.Emit(OpCodes.Pop);
                }
                cg.EmitWriteLine("\n The program finish successfully");
                cg.EmitWriteLine("\n Enter for to continue...");
                cg.EmitCall(OpCodes.Call, typeof(Console).GetMethod("ReadLine"), null);
                cg.Emit(OpCodes.Pop);
                cg.Emit(OpCodes.Ret);
                typeBuilder.CreateType();

                string filename = inputpath.Substring(inputpath.LastIndexOf('\\') + 1);
                string namef = filename.Split('.')[0];

                asmBluider.Save(namef + ".exe");

                System.Diagnostics.Process.Start(namef + ".exe");
            }
        }
Example #26
0
 public AssingmentNode(TigerNode left, TigerNode rigth)
 {
     LeftExpr = left; RigthExpr = rigth;
 }
Example #27
0
 public LessEqualThanNode(TigerNode expr1,TigerNode expr2)
     : base(expr1,expr2)
 {
 }
Example #28
0
 public FieldRecordNode(string field,TigerNode expr)
 {
     Field = field; Expr = expr;
 }
Example #29
0
 public ListLValueNode(TigerNode id,List<Access> access)
 {
     Id = id;
     Access = access;
     lval = null;
 }