internal void AddFlag(Flag f) { Succeeded = Succeeded && f.Severity != SeverityKind.Error; flags.Add(f); }
private IEnumerable <Node> Expand_Unfold(Node n, Stack <Tuple <Namespace, Symbol> > symbStack, MutableTuple <int> nextDcVarId, SuccessToken success, List <Flag> flags) { var space = symbStack.Peek().Item1; switch (n.NodeKind) { case NodeKind.Cnst: { bool wasAdded; var cnst = (Cnst)n; BaseCnstSymb symb; switch (cnst.CnstKind) { case CnstKind.Numeric: symb = (BaseCnstSymb)index.MkCnst((Rational)cnst.Raw, out wasAdded).Symbol; break; case CnstKind.String: symb = (BaseCnstSymb)index.MkCnst((string)cnst.Raw, out wasAdded).Symbol; break; default: throw new NotImplementedException(); } symbStack.Push(new Tuple <Namespace, Symbol>(space, symb)); return(null); } case NodeKind.Id: { var id = (Id)n; UserSymbol symb; if (index.SymbolTable.HasRenamingPrefix(id)) { if (!Resolve(id.Name, "constant", id, space, x => x.IsNonVarConstant, out symb, flags)) { symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } } else if (id.Fragments.Length == 1 && id.Name == API.ASTQueries.ASTSchema.Instance.DontCareName) { bool wasAdded; var fresh = index.MkVar(string.Format("{0}{1}{2}", SymbolTable.ManglePrefix, "dc", nextDcVarId.Item1), true, out wasAdded); ++nextDcVarId.Item1; symbStack.Push(new Tuple <Namespace, Symbol>(space, fresh.Symbol)); return(null); } else if (!Resolve(id.Fragments[0], "variable or constant", id, space, x => x.Kind == SymbolKind.UserCnstSymb, out symb, flags)) { symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } else if (id.Fragments.Length > 1 && symb.IsNonVarConstant) { var flag = new Flag( SeverityKind.Error, id, Constants.BadSyntax.ToString("constants do not have fields"), Constants.BadSyntax.Code); flags.Add(flag); symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } else if (symb.IsVariable) { var flag = new Flag( SeverityKind.Error, id, Constants.BadSyntax.ToString("Variables cannot appear here."), Constants.BadSyntax.Code); flags.Add(flag); symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } symbStack.Push(new Tuple <Namespace, Symbol>(symb.Namespace, symb)); return(null); } case NodeKind.FuncTerm: { var ft = (FuncTerm)n; if (ft.Function is Id) { UserSymbol symb; var ftid = (Id)ft.Function; if (ValidateUse_UserFunc(ft, space, out symb, flags, true)) { symbStack.Push(new Tuple <Namespace, Symbol>(symb.Namespace, symb)); } else { symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } return(ft.Args); } else { var flag = new Flag( SeverityKind.Error, ft, Constants.BadSyntax.ToString("Only data constructors can appear here."), Constants.BadSyntax.Code); flags.Add(flag); symbStack.Push(new Tuple <Namespace, Symbol>(null, null)); success.Failed(); return(null); } } default: throw new NotImplementedException(); } }
internal void AddFlag(Flag flag) { flags.Add(flag); Succeeded = Succeeded && flag.Severity != SeverityKind.Error; }
internal bool ParseFile(ProgramName name, string referrer, Span location, System.Threading.CancellationToken ctok, out ParseResult pr) { parseResult = new ParseResult(new Program(name)); pr = parseResult; bool result; try { var fi = new System.IO.FileInfo(name.Uri.AbsolutePath); if (!fi.Exists) { var badFile = new Flag( SeverityKind.Error, default(Span), referrer == null ? Constants.BadFile.ToString(string.Format("The file {0} does not exist", name.ToString(envParams))) : Constants.BadFile.ToString(string.Format("The file {0} referred to in {1} ({2}, {3}) does not exist", name.ToString(envParams), referrer, location.StartLine, location.StartCol)), Constants.BadFile.Code, parseResult.Program.Node.Name); parseResult.AddFlag(badFile); parseResult.Program.Node.GetNodeHash(); return(false); } var str = new System.IO.FileStream(name.Uri.AbsolutePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); ((Scanner)Scanner).SetSource(str); ((Scanner)Scanner).ParseResult = parseResult; ResetState(); result = Parse(ctok); str.Close(); } catch (Exception e) { var badFile = new Flag( SeverityKind.Error, default(Span), referrer == null ? Constants.BadFile.ToString(e.Message) : Constants.BadFile.ToString(string.Format("{0} referred to in {1} ({2}, {3})", e.Message, referrer, location.StartLine, location.StartCol)), Constants.BadFile.Code, parseResult.Program.Node.Name); parseResult.AddFlag(badFile); parseResult.Program.Node.GetNodeHash(); return(false); } if (ctok.IsCancellationRequested) { var badFile = new Flag( SeverityKind.Error, default(Span), referrer == null ? Constants.OpCancelled.ToString(string.Format("Cancelled parsing of {0}", name.ToString(envParams))) : Constants.OpCancelled.ToString(string.Format("Cancelled parsing of {0} referred to in {1} ({2}, {3})", name.ToString(envParams), referrer, location.StartLine, location.StartCol)), Constants.OpCancelled.Code, parseResult.Program.Node.Name); parseResult.AddFlag(badFile); parseResult.Program.Node.GetNodeHash(); return(false); } parseResult.Program.Node.GetNodeHash(); return(result); }