Exemple #1
0
        private static ShellParser MakeParser(string text)
        {
            AntlrInputStream  inputStream       = new AntlrInputStream(text);
            ShellLexer        shellLexer        = new ShellLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(shellLexer);
            ShellParser       shellParser       = new ShellParser(commonTokenStream);

            return(shellParser);
        }
Exemple #2
0
        public static string Escape(string segment)
        {
            if (segment.Any(c => c == '"'))
            {
                segment = segment.Replace("\"", "\\\"");
            }

            return(segment.Any(c => Char.IsWhiteSpace(c) || ShellLexer.IsSpecialChar(c))
                       ? $"\"{segment}\""
                       : segment);
        }
Exemple #3
0
        public override IShellReturnable Execute(State state, List <Tuple <int, string, Shell.Types.IShellData> > args)
        {
            var name         = (Shell.Types.String)args.First().Item3;
            var namespacedid = (Shell.Types.String)args.Skip(1).First().Item3;

            // test the name to ensure its valid
            var match = Regex.Match(name.contents, @"(\w|_)(\w|\d|_)*");

            if (!match.Success && match.Length != name.contents.Length)
            {
                Console.WriteLine("Aliasing failed! The given name cannot be set as an identifier.");
                return(new Shell.Types.None());
            }

            if (state.Names.Exists(name.contents))
            {
                Console.WriteLine("Aliasing failed! The given name is already defined.");
                return(new Shell.Types.None());
            }

            // parse the namespaced id
            var charStream  = CharStreams.fromstring(namespacedid.contents);
            var lexer       = new ShellLexer(charStream);
            var tokenStream = new CommonTokenStream(lexer);
            var parser      = new ShellParser(tokenStream)
            {
                ErrorHandler = new BailErrorStrategy()
            };

            ShellParser.Identifier_namespacedContext context;

            try {
                context = parser.identifier_namespaced();
            } catch (Exception e) {
                Console.WriteLine($"Aliasing failed! Could not parse the given namespaced identifier: {e.Message}");
                return(new Shell.Types.None());
            }

            var result = Utility.GetNamespacedIdentifier(context, state);

            if (!(result is Shell.Types.Function))
            {
                Console.WriteLine("Aliasing failed! The given namespaced id does not refer to a function.");
                return(new Shell.Types.None());
            }

            // set the alias in the calling context
            var tup = state.contexts.SkipLast(1).Last();

            tup.Item2.Set(name.contents, (Shell.Types.Function)result);

            return(new Shell.Types.None());
        }
Exemple #4
0
        private static ShellCommand ParseCommand(string command)
        {
            AntlrInputStream  inputStream       = new AntlrInputStream(command);
            ShellLexer        shellLexer        = new ShellLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(shellLexer);
            ShellParser       shellParser       = new ShellParser(commonTokenStream);

            ShellParser.ShellCommandContext context = shellParser.shellCommand();
            ShellVisitor visitor = new ShellVisitor();
            ParserResult result  = visitor.Visit(context);

            return(result.ShellCommandValue);
        }
Exemple #5
0
        /// <summary>
        /// Loads a namespace definition from file
        /// </summary>
        /// <remark>
        /// Pass rename="" to load namespace with original name
        /// </remark>
        public static Shell.Types.Namespace LoadNamespace(string path, string rename, Visitor visitor)
        {
            var pathFull = Path.GetFullPath(path);
            var pathDir  = Path.GetDirectoryName(pathFull);
            // Read and prepare file
            var src = Encoding.ASCII.GetString(File.ReadAllBytes(path));

            if (src.Last() != '\n')
            {
                src += '\n';
            }

            var charStream  = CharStreams.fromstring(src);
            var lexer       = new ShellLexer(charStream);
            var tokenStream = new CommonTokenStream(lexer);
            var parser      = new ShellParser(tokenStream);
            var tree        = parser.namespace_declaration();

            return(new Shell.Types.Namespace(rename, pathDir, tree, visitor));
        }
Exemple #6
0
        private static IShellSegment ParseCommandLine(
            string input, out IEnumerable <SyntaxToken <ShellTokenKind> > tokens
            )
        {
            try
            {
                var lexer  = new ShellLexer(input);
                var parser = new ShellParser(tokens = lexer.Tokenize());
                return(parser.ParseAll());
            }
            catch (ShellSyntaxException ex) when(!Debugger.IsAttached)
            {
                Console.WriteLine();
                ConsoleEx.WriteError($"{ex.Message} at position {ex.Span.Start.Index}");
                Console.WriteLine();

                const int    PaddingSize    = 10;
                const string PrefixEllipsis = "... ";

                var trim    = ex.Span.Start.Index > PaddingSize && input.Length > Console.BufferWidth;
                var section = trim ? $"{PrefixEllipsis}{input.Substring( ex.Span.Start.Index - PaddingSize )}" : input;

                if (section.Length > Console.BufferWidth)
                {
                    const string TrailingEllipsis = " ...";
                    section =
                        $"{section.Substring( 0, Console.BufferWidth - TrailingEllipsis.Length )}{TrailingEllipsis}";
                }

                var len        = trim ? PaddingSize + PrefixEllipsis.Length : ex.Span.Start.Index;
                var whitespace = new string( ' ', len );
                var line       = new string( '─', len );

                Console.WriteLine(section);
                Console.WriteLine($"{whitespace}^", Program.Config.ColorScheme.ErrorColor);
                Console.WriteLine($"{line}┘", Program.Config.ColorScheme.ErrorColor);
            }

            tokens = null;
            return(null);
        }