public VariableNode(DeltinScriptParser.VariableContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Name = context.PART().GetText();

            Index = new Node[context.array()?.expr().Length ?? 0];
            for (int i = 0; i < Index.Length; i++)
            {
                Index[i] = visitor.VisitExpr(context.array().expr(i));
            }
        }
 public ImportObjectNode(DeltinScriptParser.Import_objectContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     Name = context.name.Text;
     File = context.file.Text.Trim('"');
 }
        public RuleNode(DeltinScriptParser.Ow_ruleContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Name  = context.STRINGLITERAL().GetText().Trim('"');
            Block = (BlockNode)visitor.VisitBlock(context.block());

            Conditions = new Node[context.rule_if().Length];
            Range[] conditionRanges = new Range          [context.rule_if().Length];

            for (int i = 0; i < context.rule_if().Length; i++)
            {
                if (context.rule_if(i).expr() != null)
                {
                    Conditions[i] = visitor.VisitExpr(context.rule_if(i).expr());
                }

                // Get the range between the ().
                conditionRanges[i] = Range.GetRange(
                    context.rule_if(i).LEFT_PAREN().Symbol,
                    context.rule_if(i).RIGHT_PAREN().Symbol
                    );
            }

            RuleEvent      eventType = RuleEvent.OngoingGlobal;
            Team           team      = Team.All;
            PlayerSelector player    = PlayerSelector.All;

            Range eventRange  = null;
            Range teamRange   = null;
            Range playerRange = null;

            foreach (var ruleOption in context.@enum())
            {
                string option      = ruleOption.PART(0).GetText();
                Range  optionRange = Range.GetRange(ruleOption.PART(0).Symbol);

                string value      = ruleOption.PART(1)?.GetText();
                Range  valueRange = null;
                if (value != null)
                {
                    valueRange = Range.GetRange(ruleOption.PART(1).Symbol);
                }

                Range totalRange;
                if (ruleOption.PART(1) != null)
                {
                    totalRange = Range.GetRange(ruleOption.PART(0).Symbol, ruleOption.PART(1).Symbol);
                }
                else
                {
                    totalRange = Range.GetRange(ruleOption.PART(0));
                }

                switch (option)
                {
                case "Event":
                    if (eventRange != null)
                    {
                        visitor._diagnostics.Error("Event already set.", new Location(visitor.file, totalRange));
                    }

                    if (!Enum.TryParse <RuleEvent>(value, out eventType))
                    {
                        visitor._diagnostics.Error($"{value} is not a valid Event type.", new Location(visitor.file, valueRange));
                    }

                    eventRange = Range.GetRange(ruleOption);
                    break;

                case "Team":
                    if (teamRange != null)
                    {
                        visitor._diagnostics.Error("Team already set.", new Location(visitor.file, totalRange));
                    }

                    if (!Enum.TryParse <Team>(value, out team))
                    {
                        visitor._diagnostics.Error($"{value} is not a valid Team type.", new Location(visitor.file, valueRange));
                    }

                    teamRange = Range.GetRange(ruleOption);
                    break;

                case "Player":
                    if (playerRange != null)
                    {
                        visitor._diagnostics.Error("Player already set.", new Location(visitor.file, totalRange));
                    }

                    if (!Enum.TryParse <PlayerSelector>(value, out player))
                    {
                        visitor._diagnostics.Error($"{value} is not a valid Player type.", new Location(visitor.file, valueRange));
                    }

                    playerRange = Range.GetRange(ruleOption);
                    break;

                default:
                    visitor._diagnostics.Error($"{option} is not a valid rule option.", new Location(visitor.file, optionRange));
                    break;
                }
            }
            Event  = eventType;
            Team   = team;
            Player = player;

            SubRanges = ArrayBuilder <Range> .Build(eventRange, teamRange, playerRange, conditionRanges);
        }
Example #4
0
 public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
 {
     Errors.Add(new Diagnostic(msg, Range.GetRange(offendingSymbol)));
 }
 public InclassDefineNode(DeltinScriptParser.Inclass_defineContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     VariableName = context.name.Text;
     Type         = context.type?.Text;
     if (context.expr() != null)
     {
         Value = visitor.Visit(context.expr());
     }
     if (context.accessor() != null)
     {
         AccessLevel = (AccessLevel)Enum.Parse(typeof(AccessLevel), context.accessor().GetText(), true);
     }
 }
 public ParameterDefineNode(DeltinScriptParser.Parameter_defineContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     VariableName = context.name.Text;
     Type         = context.type?.Text;
 }
        // "Hello <0>! Waiting game..."
        public override Node VisitString(DeltinScriptParser.StringContext context)
        {
            string value = context.STRINGLITERAL().GetText().Trim('"');

            return(new StringNode(value, null, new Location(file, Range.GetRange(context))));
        }
        public RulesetNode(DeltinScriptParser.RulesetContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Imports = new ImportNode[context.import_file().Length];
            for (int i = 0; i < Imports.Length; i++)
            {
                Imports[i] = new ImportNode(context.import_file(i), visitor);
            }

            ObjectImports = new ImportObjectNode[context.import_object().Length];
            for (int i = 0; i < ObjectImports.Length; i++)
            {
                ObjectImports[i] = new ImportObjectNode(context.import_object(i), visitor);
            }

            Rules = new RuleNode[context.ow_rule().Length];
            for (int i = 0; i < Rules.Length; i++)
            {
                Rules[i] = (RuleNode)visitor.VisitOw_rule(context.ow_rule()[i]);
            }

            if (context.useGlobalVar() != null)
            {
                if (Enum.TryParse(context.useGlobalVar().PART().GetText(), out Variable temp))
                {
                    UseGlobalVar = temp;
                }
            }

            if (context.usePlayerVar() != null)
            {
                if (Enum.TryParse(context.usePlayerVar().PART().GetText(), out Variable temp))
                {
                    UsePlayerVar = temp;
                }
            }

            if (context.useDimVar() != null)
            {
                if (Enum.TryParse(context.useDimVar().PART().GetText(), out Variable temp))
                {
                    UseBuilderVar = temp;
                }
            }

            DefinedVars = new RuleDefineNode[context.rule_define().Length];
            for (int i = 0; i < DefinedVars.Length; i++)
            {
                DefinedVars[i] = (RuleDefineNode)visitor.VisitRule_define(context.rule_define(i));
            }

            UserMethods = new UserMethodNode[context.user_method().Length];
            for (int i = 0; i < UserMethods.Length; i++)
            {
                UserMethods[i] = (UserMethodNode)visitor.VisitUser_method(context.user_method(i));
            }

            DefinedTypes = new TypeDefineNode[context.type_define().Length];
            for (int i = 0; i < DefinedTypes.Length; i++)
            {
                DefinedTypes[i] = (TypeDefineNode)visitor.VisitType_define(context.type_define(i));
            }
        }
        public ForEachNode(DeltinScriptParser.ForeachContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Array    = visitor.Visit(context.expr());
            Variable = new ParameterDefineNode(context.parameter_define(), visitor);
            Block    = (BlockNode)visitor.VisitBlock(context.block());

            Repeaters = 1;
            if (context.number() != null)
            {
                Repeaters = int.Parse(context.number().GetText());
            }
        }
        // -123.456
        public override Node VisitNumber(DeltinScriptParser.NumberContext context)
        {
            double value = double.Parse(context.GetText());

            return(new NumberNode(value, new Location(file, Range.GetRange(context))));
        }
        public VarSetNode(DeltinScriptParser.VarsetContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Variable = visitor.VisitExpr(context.var);

            Node[] index = new Node[context.array()?.expr().Length ?? 0];
            for (int i = 0; i < index.Length; i++)
            {
                index[i] = visitor.VisitExpr(context.array().expr(i));
            }

            if (context.val != null)
            {
                Value = visitor.VisitExpr(context.val);
            }

            Operation = context.statement_operation()?.GetText();
            if (Operation == null)
            {
                if (context.INCREMENT() != null)
                {
                    Operation = "++";
                }
                else if (context.DECREMENT() != null)
                {
                    Operation = "--";
                }
            }
        }
        public CreateObjectNode(DeltinScriptParser.Create_objectContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            TypeName = context.type.Text;

            Parameters = new Node[context.call_parameters()?.expr().Length ?? 0];
            for (int i = 0; i < Parameters.Length; i++)
            {
                Parameters[i] = visitor.VisitExpr(context.call_parameters().expr()[i]);
            }
        }
 public ExpressionTreeNode(DeltinScriptParser.ExprContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     Tree = new Node[context.expr().Length];
     for (int i = 0; i < Tree.Length; i++)
     {
         Tree[i] = visitor.VisitExpr(context.expr(i));
     }
 }
        public TypeDefineNode(DeltinScriptParser.Type_defineContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            if (context.STRUCT() != null)
            {
                TypeKind = TypeKind.Struct;
            }
            else if (context.CLASS() != null)
            {
                TypeKind = TypeKind.Class;
            }
            else
            {
                throw new Exception();
            }

            Name = context.name.Text;

            DefinedVars = new InclassDefineNode[context.inclass_define().Length];
            for (int i = 0; i < DefinedVars.Length; i++)
            {
                DefinedVars[i] = (InclassDefineNode)visitor.VisitInclass_define(context.inclass_define(i));
            }

            Constructors = new ConstructorNode[context.constructor().Length];
            for (int i = 0; i < Constructors.Length; i++)
            {
                Constructors[i] = (ConstructorNode)visitor.VisitConstructor(context.constructor(i));
            }

            Methods = new UserMethodNode[context.user_method().Length];
            for (int i = 0; i < Methods.Length; i++)
            {
                Methods[i] = (UserMethodNode)visitor.VisitUser_method(context.user_method(i));
            }
        }
 public DeleteNode(DeltinScriptParser.DeleteContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     Delete = visitor.VisitExpr(context.expr());
 }
        public ConstructorNode(DeltinScriptParser.ConstructorContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Name = context.PART().GetText();

            Parameters = new ParameterDefineNode[context.setParameters().parameter_define().Length];
            for (int i = 0; i < Parameters.Length; i++)
            {
                Parameters[i] = new ParameterDefineNode(context.setParameters().parameter_define(i), visitor);
            }

            AccessLevel = AccessLevel.Private;
            if (context.accessor() != null)
            {
                AccessLevel = (AccessLevel)Enum.Parse(typeof(AccessLevel), context.accessor().GetText(), true);
            }

            BlockNode = (BlockNode)visitor.VisitBlock(context.block());
        }
        // Method()
        public override Node VisitMethod(DeltinScriptParser.MethodContext context)
        {
            string methodName = context.PART().GetText();

            Node[] parameters = new Node[context.call_parameters()?.expr().Length ?? 0];
            for (int i = 0; i < parameters.Length; i++)
            {
                parameters[i] = Visit(context.call_parameters().expr()[i]);
            }

            Range nameRange      = Range.GetRange(context.PART().Symbol);
            Range parameterRange = Range.GetRange(context.LEFT_PAREN().Symbol, context.RIGHT_PAREN().Symbol);

            return(new MethodNode(methodName, parameters, nameRange, parameterRange, new Location(file, Range.GetRange(context))));
        }
 public RuleDefineNode(DeltinScriptParser.Rule_defineContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     VariableName = context.name.Text;
     Type         = context.type?.Text;
     if (context.expr() != null)
     {
         Value = visitor.Visit(context.expr());
     }
     if (context.useVar() != null)
     {
         UseVar = (UseVarNode)visitor.Visit(context.useVar());
     }
     IsGlobal = context.GLOBAL() != null;
 }
 public override Node VisitFalse(DeltinScriptParser.FalseContext context)
 {
     return(new BooleanNode(false, new Location(file, Range.GetRange(context))));
 }
        public override Node VisitExpr(DeltinScriptParser.ExprContext context)
        {
            Node node;

            // Operations
            if (context.ChildCount == 3 && Constants.AllOperations.Contains(context.GetChild(1).GetText()))
            {
                Node   left      = Visit(context.GetChild(0));
                string operation = context.GetChild(1).GetText();
                Node   right     = Visit(context.GetChild(2));

                node = new OperationNode(left, operation, right, new Location(file, Range.GetRange(context)));
            }

            // Getting values in arrays
            else if (context.ChildCount == 4 &&
                     context.GetChild(0) is DeltinScriptParser.ExprContext &&
                     context.GetChild(1).GetText() == "[" &&
                     context.GetChild(2) is DeltinScriptParser.ExprContext &&
                     context.GetChild(3).GetText() == "]")
            {
                Node value = Visit(context.GetChild(0));
                Node index = Visit(context.GetChild(2));

                node = new ValueInArrayNode(value, index, new Location(file, Range.GetRange(context)));
            }

            // Seperator
            else if (context.SEPERATOR() != null && context.expr().Length >= 2)
            {
                node = new ExpressionTreeNode(context, this);
            }

            // Not
            else if (context.ChildCount == 2 &&
                     context.GetChild(0).GetText() == "!" &&
                     context.GetChild(1) is DeltinScriptParser.ExprContext)
            {
                Node value = Visit(context.GetChild(1));
                node = new NotNode(value, new Location(file, Range.GetRange(context)));
            }

            // Ternary Condition
            else if (context.ChildCount == 5 &&
                     context.GetChild(0) is DeltinScriptParser.ExprContext &&
                     context.GetChild(1).GetText() == "?" &&
                     context.GetChild(2) is DeltinScriptParser.ExprContext &&
                     context.GetChild(3).GetText() == ":" &&
                     context.GetChild(4) is DeltinScriptParser.ExprContext)
            {
                Node condition   = VisitExpr(context.expr(0));
                Node consequent  = VisitExpr(context.expr(1));
                Node alternative = VisitExpr(context.expr(2));
                node = new TernaryConditionalNode(condition, consequent, alternative, new Location(file, Range.GetRange(context)));
            }

            // This
            else if (context.THIS() != null)
            {
                node = new ThisNode(new Location(file, Range.GetRange(context)));
            }

            else
            {
                return(Visit(context.GetChild(0)));
            }

            return(node);
        }
 public override Node VisitNull(DeltinScriptParser.NullContext context)
 {
     return(new NullNode(new Location(file, Range.GetRange(context))));
 }
        public UseVarNode(DeltinScriptParser.UseVarContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            if (Enum.TryParse(context.PART().GetText(), out Variable temp))
            {
                Variable = temp;
            }

            int index = -1;

            if (context.number() != null)
            {
                if (!int.TryParse(context.number().GetText(), out index))
                {
                    index = -1;
                }
            }
            if (index != -1)
            {
                Index = new int[] { index }
            }
            ;
        }
        public override Node VisitFor(DeltinScriptParser.ForContext context)
        {
            BlockNode block = (BlockNode)VisitBlock(context.block());

            VarSetNode varSet = null;

            if (context.varset() != null)
            {
                varSet = (VarSetNode)VisitVarset(context.varset());
            }

            DefineNode defineNode = null;

            if (context.define() != null)
            {
                defineNode = (DefineNode)VisitDefine(context.define());
            }

            Node expression = null;

            if (context.expr() != null)
            {
                expression = VisitExpr(context.expr());
            }

            VarSetNode statement = null;

            if (context.forEndStatement() != null)
            {
                statement = (VarSetNode)VisitVarset(context.forEndStatement().varset());
            }

            return(new ForNode(varSet, defineNode, expression, statement, block, new Location(file, Range.GetRange(context))));
        }
Example #24
0
        public override object VisitEnum(DeltinScriptParser.EnumContext context)
        {
            string type  = context.ENUM().GetText();
            string value = context.PART()?.GetText();

            if (value == null)
            {
                _diagnostics.Add(new Diagnostic("Expected enum value.", Range.GetRange(context))
                {
                    severity = Diagnostic.Error
                });
            }

            else if (EnumData.GetEnumValue(type, value) == null)
            {
                _diagnostics.Add(new Diagnostic(string.Format(SyntaxErrorException.invalidEnumValue, value, type), Range.GetRange(context))
                {
                    severity = Diagnostic.Error
                });
            }

            return(base.VisitEnum(context));
        }
 public ImportNode(DeltinScriptParser.Import_fileContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
 {
     File = context.STRINGLITERAL().GetText().Trim('"');
 }
Example #26
0
        public override object VisitEnum(DeltinScriptParser.EnumContext context)
        {
            string type  = context.PART(0).GetText();
            string value = context.PART(1)?.GetText();

            if (value == null)
            {
                _diagnostics.Error("Expected enum value.", new Location(_file, Range.GetRange(context)));
            }

            else if (EnumData.GetEnumValue(type, value) == null)
            {
                _diagnostics.Error(string.Format(SyntaxErrorException.invalidEnumValue, value, type), new Location(_file, Range.GetRange(context)));
            }

            return(base.VisitEnum(context));
        }
        public UserMethodNode(DeltinScriptParser.User_methodContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, Range.GetRange(context)))
        {
            Name = context.name.Text;
            Type = context.type?.Text;

            Parameters = new ParameterDefineNode[context.setParameters().parameter_define().Length];
            for (int i = 0; i < Parameters.Length; i++)
            {
                Parameters[i] = new ParameterDefineNode(context.setParameters().parameter_define(i), visitor);
            }

            Block         = (BlockNode)visitor.VisitBlock(context.block());
            IsRecursive   = context.RECURSIVE() != null;
            Documentation = string.Join("\n\r", context.DOCUMENTATION().Select(doc => doc.GetText().TrimEnd().TrimStart('#', ' ')));

            AccessLevel = AccessLevel.Private;
            if (context.accessor() != null)
            {
                AccessLevel = (AccessLevel)Enum.Parse(typeof(AccessLevel), context.accessor().GetText(), true);
            }
        }