Exemple #1
0
 private void PutVariableIfInBlock(VariableNameTableItem res)
 {
     if (inProgramBlock || currentRoutine != null)
     {
         scope.PutVariable(res);
     }
 }
Exemple #2
0
 private void TranslateDeclareHead(VariableNameTableItem item, IndentedTextWriter writer)
 {
     // module var
     if (item.IsConstant)
     {
         writer.Write("const ");
     }
     writer.Write($"{GetStringFromType(item.Type)} {item.Name}");
 }
Exemple #3
0
        public override object VisitConstDecl([NotNull] SLangGrammarParser.ConstDeclContext context)
        {
            var type      = Visit(context.scalarType()) as SlangType;
            var nameToken = context.Id().Symbol;
            var item      = new VariableNameTableItem {
                Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text
            };

            PutVariableIfInBlock(item);
            TranslateDeclare(item, context.exp());
            return(null);
        }
Exemple #4
0
 private void TranslateDeclare(VariableNameTableItem item, SLangGrammarParser.ExpContext expContext)
 {
     if (!inProgramBlock && currentRoutine == null)
     {
         TranslateDeclareHead(item, headerText);
     }
     TranslateDeclareHead(item, cppText);
     if (expContext != null)
     {
         cppText.Write(" = ");
         Visit(expContext);
     }
 }
Exemple #5
0
        public override object VisitArrayDecl([NotNull] SLangGrammarParser.ArrayDeclContext context)
        {
            var type      = Visit(context.arrayDeclType()) as SlangType;
            var nameToken = context.Id().Symbol;
            var res       = new VariableNameTableItem {
                Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text
            };

            if (!inProgramBlock && currentRoutine == null)
            {
                TranslateDeclareHead(res, headerText);
            }
            TranslateDeclareHead(res, cppText);

            // write constructor
            var exps           = context.arrayDeclType().exp();
            int dimensionCount = exps.Length;
            int n = dimensionCount - 1;

            foreach (var exp in context.arrayDeclType().exp())
            {
                cppText.Write("(");
                Visit(exp);

                if (n > 0)
                {
                    cppText.Write(", ");
                    cppText.Write(GetVectorTypeStart(n));
                    var arrType = Visit(context.arrayDeclType().scalarType()) as SlangType;
                    cppText.Write(GetStringFromType(arrType));
                    cppText.Write(GetVectorTypeEnd(n));
                }

                n--;
            }

            for (int i = 0; i < exps.Length; ++i)
            {
                cppText.Write(")");
            }

            PutVariableIfInBlock(res);
            return(null);
        }
Exemple #6
0
        // declares
        public override object VisitSimpleDecl([NotNull] SLangGrammarParser.SimpleDeclContext context)
        {
            SlangType type;

            if (context.simpleType() != null)
            {
                type = Visit(context.simpleType()) as SlangType;
            }
            else
            {
                type = Visit(context.customType()) as SlangType;
            }

            var nameToken = context.Id().Symbol;
            var res       = new VariableNameTableItem {
                Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text
            };

            PutVariableIfInBlock(res);
            TranslateDeclare(res, context.exp());
            return(null);
        }
Exemple #7
0
 private void TranslateClassFieldDecl(VariableNameTableItem field)
 {
     headerText.WriteLine($"{GetStringFromType(field.Type)} {field.Name};");
 }
 public static void ThrowFieldOfClassTypeException(FileInfo file, VariableNameTableItem item) => ThrowException($"Invalid use of variable with type {item.Type} in class {item.Type}, only pointers allowed", file, item.Line, item.Column);