Example #1
0
 internal void AddFlag(Flag f)
 {
     Succeeded = Succeeded && f.Severity != SeverityKind.Error;
     flags.Add(f);
 }
Example #2
0
        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();
            }
        }
Example #3
0
 internal void AddFlag(Flag flag)
 {
     flags.Add(flag);
     Succeeded = Succeeded && flag.Severity != SeverityKind.Error;
 }
Example #4
0
        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);
        }