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); }
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)))); }
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('"'); }
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); } }