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); }
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); }
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()); }
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); }
/// <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)); }
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); }