Esempio n. 1
0
        private static Classification <dynamic> Interpret(ref Environment <Classification <dynamic> > environment, string line)
        {
            var tokens = ProgramParsing.Separated(ProgramParsing.Token()).ParseCompletely(line.ToStream());

            var command = ProgramParsing.CommandLine().ParseCompletely(tokens.ToStream());

            foreach (var defun in command.Definition.Each())
            {
                var term = defun;
                foreach (var type in command.Declaration.Each())
                {
                    term = new Term.Annotation(new Annotated(type, term));
                }

                var typed = Execute(environment, term);

                if (command.Identifier != null)
                {
                    if (environment.Maps(command.Identifier))
                    {
                        Console.WriteLine("Shadowing is not allowed!");
                    }
                    else
                    {
                        environment = environment.Push(command.Identifier, typed);
                    }
                }

                return(typed);
            }

            throw new ArgumentException("Command line must include evaluable expression.");
        }
Esempio n. 2
0
        public static IParser <Token, Statement> Element()
        {
            var declaration = Literal(Symbols.HasType).Continue(_ => Expression()).Option();

            var definition = Literal(Symbols.Equals).Continue(_ => Expression()).Option();

            return(Identifier().Continue(identifier =>
                                         Parameter().Repeat().Continue(parameters =>
                                                                       declaration.Continue(type =>
                                                                                            definition.Continue(term =>
            {
                if (type.Tag == Option.None && term.Tag == Option.None)
                {
                    return Parsers.Fails <Token, Statement>("Statement must be a declaration or a definition.");
                }

                if (parameters.Length != 0)
                {
                    if (term.Tag == Option.None)
                    {
                        throw new ArgumentException("Cannot have parameters on the left hand side of a pure declaration: " + identifier);
                    }

                    var body = term.Get();

                    foreach (var annotation in type.Each())
                    {
                        body = new Term.Annotation(new Annotated(annotation, body));
                    }

                    return Parsers.Returns <Token, Statement>(new Statement(identifier, new Option <Term> .None(), MergeDefinitionParameters(parameters, body).Some()));
                }

                return Parsers.Returns <Token, Statement>(new Statement(identifier, type, term));
            })))));
        }
Esempio n. 3
0
        private static Definition[] AccumulateDefinitions(Statement[] bindings)
        {
            var declarations = new Dictionary <string, Term>(bindings.Length);

            var definitions = new List <Definition>(bindings.Length);

            foreach (var element in bindings)
            {
                foreach (var type in element.Declaration.Each())
                {
                    declarations.Add(element.Identifier, type);
                }

                foreach (var term in element.Definition.Each())
                {
                    var identifier = element.Identifier;

                    if (declarations.ContainsKey(identifier))
                    {
                        var declared = declarations[identifier];

                        declarations.Remove(identifier);

                        var body = new Term.Annotation(new Annotated(declared, term));

                        definitions.Add(new Definition(identifier, body));
                    }
                    else
                    {
                        definitions.Add(new Definition(identifier, term));
                    }
                }
            }

            return(definitions.ToArray());
        }