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; }
private RulesetNode GetRuleset(string file, string content) { AntlrInputStream inputStream = new AntlrInputStream(content); // Lexer DeltinScriptLexer lexer = new DeltinScriptLexer(inputStream); CommonTokenStream commonTokenStream = new CommonTokenStream(lexer); // Parse DeltinScriptParser parser = new DeltinScriptParser(commonTokenStream); var errorListener = new ErrorListener(file, Diagnostics); parser.RemoveErrorListeners(); parser.AddErrorListener(errorListener); DeltinScriptParser.RulesetContext ruleSetContext = parser.ruleset(); Log.Write(LogLevel.Verbose, ruleSetContext.ToStringTree(parser)); // Get the ruleset node. RulesetNode ruleset = null; if (!Diagnostics.ContainsErrors()) { BuildAstVisitor bav = new BuildAstVisitor(file, Diagnostics); ruleset = (RulesetNode)bav.Visit(ruleSetContext); } AdditionalErrorChecking aec = new AdditionalErrorChecking(file, parser, Diagnostics); aec.Visit(ruleSetContext); return(ruleset); }
public MethodNode(DeltinScriptParser.MethodContext context, BuildAstVisitor visitor) : base( new Location(visitor.file, DocRange.GetRange(context)), DocRange.GetRange(context.PART().Symbol), DocRange.GetRange(context.LEFT_PAREN().Symbol, context.RIGHT_PAREN().Symbol) ) { Name = context.PART().GetText(); if (context.call_parameters() != null) { Parameters = new Node[context.call_parameters().expr().Length]; for (int i = 0; i < Parameters.Length; i++) { Parameters[i] = visitor.Visit(context.call_parameters().expr()[i]); } } else if (context.picky_parameters() != null) { PickyParameters = new PickyParameter[context.picky_parameters().picky_parameter().Length]; for (int i = 0; i < PickyParameters.Length; i++) { PickyParameters[i] = new PickyParameter(context.picky_parameters().picky_parameter(i), visitor); } } else { Parameters = new Node[0]; } }
public PickyParameter(DeltinScriptParser.Picky_parameterContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, DocRange.GetRange(context))) { Name = context.PART()?.GetText(); if (context.expr() != null) { Expression = visitor.Visit(context.expr()); } }
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()); } }
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 RuleDefineNode(DeltinScriptParser.Rule_defineContext context, BuildAstVisitor visitor) : base(new Location(visitor.file, DocRange.GetRange(context))) { VariableName = context.name.Text; Type = context.type?.Text; if (context.expr() != null) { Value = visitor.Visit(context.expr()); } Extended = context.NOT() != null; IsGlobal = context.GLOBAL() != null; if (context.id != null) { OverrideID = int.Parse(context.id.GetText()); } }
public static ParserData GetParser(string document, Pos documentPos) { AntlrInputStream inputStream = new AntlrInputStream(document); // Lexer DeltinScriptLexer lexer = new DeltinScriptLexer(inputStream); CommonTokenStream commonTokenStream = new CommonTokenStream(lexer); // Parse DeltinScriptParser parser = new DeltinScriptParser(commonTokenStream); var errorListener = new ErrorListener(); parser.RemoveErrorListeners(); parser.AddErrorListener(errorListener); DeltinScriptParser.RulesetContext ruleSetContext = parser.ruleset(); List <Diagnostic> diagnostics = new List <Diagnostic>(); diagnostics.AddRange(errorListener.Errors); // Get the ruleset node. BuildAstVisitor bav = null; RulesetNode ruleSetNode = null; if (diagnostics.Count == 0) { bav = new BuildAstVisitor(documentPos, diagnostics); ruleSetNode = (RulesetNode)bav.Visit(ruleSetContext); } VarCollection varCollection = null; ScopeGroup root = null; List <UserMethod> userMethods = null; Rule[] rules = null; bool success = false; AdditionalErrorChecking aec = new AdditionalErrorChecking(parser, diagnostics); aec.Visit(ruleSetContext); bool parse = diagnostics.Count == 0; if (parse) { varCollection = new VarCollection(); root = new ScopeGroup(); userMethods = new List <UserMethod>(); foreach (var definedVar in ruleSetNode.DefinedVars) { varCollection.AssignDefinedVar(root, definedVar.IsGlobal, definedVar.VariableName, definedVar.Range); } // Get the user methods. for (int i = 0; i < ruleSetNode.UserMethods.Length; i++) { userMethods.Add(new UserMethod(ruleSetNode.UserMethods[i])); } // Parse the rules. rules = new Rule[ruleSetNode.Rules.Length]; for (int i = 0; i < rules.Length; i++) { try { var result = Translate.GetRule(ruleSetNode.Rules[i], root, varCollection, userMethods.ToArray()); rules[i] = result.Rule; diagnostics.AddRange(result.Diagnostics); } catch (SyntaxErrorException ex) { diagnostics.Add(new Diagnostic(ex.Message, ex.Range) { severity = Diagnostic.Error }); } } success = true; } return(new ParserData() { Parser = parser, RulesetContext = ruleSetContext, RuleSetNode = ruleSetNode, Bav = bav, Diagnostics = diagnostics, Rules = rules, UserMethods = userMethods?.ToArray(), Root = root, Success = success, VarCollection = varCollection }); }