public void CheckCommentFunctionInClass(ParserRuleContext context, out ErrorInformation error) { error = null; var classMemberContext = (Class_member_declarationContext)context; if (IsMethod(classMemberContext.common_member_declaration()) && tokenStream.GetHiddenTokensToLeft(context.Start.TokenIndex, CSharpLexer.COMMENTS_CHANNEL) == null) { var functionContext = GetFunctionIdentifierContext(classMemberContext.common_member_declaration()); error = CreateError(functionContext); } }
private List <String> ExtractDocumentation(ParserRuleContext context) { IList <IToken> tokens = _tokens.GetHiddenTokensToLeft(context.Start.TokenIndex); if (tokens == null) { return(null); } List <String> comments = null; foreach (IToken token in tokens) { if (token.Text.StartsWith("///")) { if (comments == null) { comments = new List <String>(); } comments.Add(token.Text.Substring(3).Trim()); } } return(comments); }
public static void Reconstruct(IParseTree tree, CommonTokenStream stream) { if (tree as TerminalNodeImpl != null) { TerminalNodeImpl tok = tree as TerminalNodeImpl; Interval interval = tok.SourceInterval; var inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex); if (inter != null) { foreach (var t in inter) { System.Console.Write(t.Text); } } var s = stream.GetText(interval); System.Console.Write(s); } else { for (int i = 0; i < tree.ChildCount; ++i) { var c = tree.GetChild(i); Reconstruct(c, stream); } } }
private static void ParenthesizedAST(IParseTree tree, StringBuilder sb, Lexer lexer, Parser parser, CommonTokenStream stream, int level = 0) { // Antlr always names a non-terminal with first letter lowercase, // but renames it when creating the type in C#. So, remove the prefix, // lowercase the first letter, and remove the trailing "Context" part of // the name. Saves big time on output! if (tree as TerminalNodeImpl != null) { TerminalNodeImpl tok = tree as TerminalNodeImpl; Interval interval = tok.SourceInterval; IList <IToken> inter = null; if (tok.Symbol.TokenIndex >= 0) { inter = stream?.GetHiddenTokensToLeft(tok.Symbol.TokenIndex); } if (inter != null) { foreach (var t in inter) { var ty = tok.Symbol.Type; var name = lexer.Vocabulary.GetSymbolicName(ty); StartLine(sb, level); sb.AppendLine("( " + name + " text=" + PerformEscapes(t.Text) + " " + lexer.ChannelNames[t.Channel]); } } { var ty = tok.Symbol.Type; var name = lexer.Vocabulary.GetSymbolicName(ty); StartLine(sb, level); sb.AppendLine("( " + name + " i=" + tree.SourceInterval.a + " txt=" + PerformEscapes(tree.GetText()) + " tt=" + tok.Symbol.Type + " " + lexer.ChannelNames[tok.Symbol.Channel]); } } else { var x = tree as RuleContext; var ri = x.RuleIndex; var name = parser.RuleNames[ri]; StartLine(sb, level); sb.Append("( " + name); sb.AppendLine(); } for (int i = 0; i < tree.ChildCount; ++i) { var c = tree.GetChild(i); ParenthesizedAST(c, sb, lexer, parser, stream, level + 1); } if (level == 0) { for (int k = 0; k < 1 + changed - level; ++k) { sb.Append(") "); } sb.AppendLine(); changed = 0; } }
private static void ParenthesizedAST(this IParseTree tree, StringBuilder sb, CommonTokenStream stream, int level = 0) { // Antlr always names a non-terminal with first letter lowercase, // but renames it when creating the type in C#. So, remove the prefix, // lowercase the first letter, and remove the trailing "Context" part of // the name. Saves big time on output! if (tree as TerminalNodeImpl != null) { TerminalNodeImpl tok = tree as TerminalNodeImpl; Interval interval = tok.SourceInterval; IList <IToken> inter = null; if (tok.Symbol.TokenIndex >= 0) { inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex); } if (inter != null) { foreach (IToken t in inter) { StartLine(sb, tree, stream, level); sb.AppendLine("( " + ((Lexer)stream.TokenSource).ChannelNames[t.Channel] + " text=" + t.Text.PerformEscapes()); } } StartLine(sb, tree, stream, level); sb.AppendLine("( " + ((Lexer)stream.TokenSource).ChannelNames[tok.Symbol.Channel] + " i=" + tree.SourceInterval.a + " txt=" + tree.GetText().PerformEscapes() + " tt=" + tok.Symbol.Type); } else { string fixed_name = tree.GetType().ToString() .Replace("Antlr4.Runtime.Tree.", ""); fixed_name = Regex.Replace(fixed_name, "^.*[+]", ""); fixed_name = fixed_name.Substring(0, fixed_name.Length - "Context".Length); fixed_name = fixed_name[0].ToString().ToLower() + fixed_name.Substring(1); StartLine(sb, tree, stream, level); sb.Append("( " + fixed_name); sb.AppendLine(); } for (int i = 0; i < tree.ChildCount; ++i) { IParseTree c = tree.GetChild(i); c.ParenthesizedAST(sb, stream, level + 1); } if (level == 0) { for (int k = 0; k < 1 + changed - level; ++k) { sb.Append(") "); } sb.AppendLine(); changed = 0; } }
public void ParenthesizedAST(StringBuilder sb, string file_name, IParseTree tree, CommonTokenStream stream, int level = 0) { // Antlr always names a non-terminal with first letter lowercase, // but renames it when creating the type in C#. So, remove the prefix, // lowercase the first letter, and remove the trailing "Context" part of // the name. Saves big time on output! if (tree as TerminalNodeImpl != null) { TerminalNodeImpl tok = tree as TerminalNodeImpl; Interval interval = tok.SourceInterval; var inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex); if (inter != null) { foreach (var t in inter) { StartLine(sb, file_name, tree, stream, level); sb.AppendLine("( HIDDEN text=" + t.Text.provide_escapes()); } } StartLine(sb, file_name, tree, stream, level); sb.AppendLine("( TOKEN i=" + tree.SourceInterval.a + " t=" + tree.GetText().provide_escapes()); } else { var fixed_name = tree.GetType().ToString() .Replace("Antlr4.Runtime.Tree.", ""); fixed_name = Regex.Replace(fixed_name, "^.*[+]", ""); fixed_name = fixed_name.Substring(0, fixed_name.Length - "Context".Length); fixed_name = fixed_name[0].ToString().ToLower() + fixed_name.Substring(1); StartLine(sb, file_name, tree, stream, level); sb.Append("( " + fixed_name); if (level == 0) { sb.Append(" File=\"" + file_name + "\""); } sb.AppendLine(); } for (int i = 0; i < tree.ChildCount; ++i) { var c = tree.GetChild(i); ParenthesizedAST(sb, file_name, c, stream, level + 1); } if (level == 0) { for (int k = 0; k < 1 + changed - level; ++k) { sb.Append(") "); } sb.AppendLine(); changed = 0; } }
public static string GetLeftOfToken(int index) { StringBuilder sb = new StringBuilder(); var inter = tokens.GetHiddenTokensToLeft(index); if (inter != null) { foreach (var t in inter) { sb.Append(t.Text); } } return(sb.ToString()); }
public override void Walk(IParseTreeListener listener, IParseTree t) { string docText = null; // check for documentation var token = t as ITerminalNode; if (token != null) { var docTokens = _tokens.GetHiddenTokensToLeft(token.Symbol.TokenIndex); if (docTokens != null) { docText = string.Join("\n", docTokens.Select(x => x.Text)); } } // update the current line var node = t as IRuleNode; if (node != null) { var ctx = (ParserRuleContext)node.RuleContext; Line = ctx.Start.Line; } try { base.Walk(listener, t); // pass documentation if there was any var kryptonListener = listener as KryptonParserListener; if (kryptonListener != null && docText != null) { kryptonListener.EnterDocumentation(docText); } } // Rethrow any parser exceptions thrown while walking (avoids stack trace) catch (KryptonParserException e) { throw e; } }