diff --git a/runtime-testsuite/resources/org/antlr/v4/test/runtime/templates/CSharp.test.stg b/runtime-testsuite/resources/org/antlr/v4/test/runtime/templates/CSharp.test.stg index a41089dd5..597248f2b 100644 --- a/runtime-testsuite/resources/org/antlr/v4/test/runtime/templates/CSharp.test.stg +++ b/runtime-testsuite/resources/org/antlr/v4/test/runtime/templates/CSharp.test.stg @@ -1,6 +1,6 @@ -writeln(s) ::= <);>> -write(s) ::= <);>> -writeList(s) ::= <);>> +writeln(s) ::= <);>> +write(s) ::= <);>> +writeList(s) ::= <);>> False() ::= "false" @@ -176,8 +176,14 @@ public class PositionAdjustingLexerATNSimulator : LexerATNSimulator { BasicListener(X) ::= << @parser::members { public class LeafListener : TBaseListener { + private readonly TextWriter Output; + + public LeafListener(TextWriter output) { + Output = output; + } + public override void VisitTerminal(ITerminalNode node) { - Console.WriteLine(node.Symbol.Text); + Output.WriteLine(node.Symbol.Text); } } } @@ -185,7 +191,7 @@ public class LeafListener : TBaseListener { WalkListener(s) ::= << ParseTreeWalker walker = new ParseTreeWalker(); -walker.Walk(new LeafListener(), ); +walker.Walk(new LeafListener(Output), ); >> TreeNodeWithAltNumField(X) ::= << @@ -204,6 +210,12 @@ public class MyRuleNode : ParserRuleContext { TokenGetterListener(X) ::= << @parser::members { public class LeafListener : TBaseListener { + private readonly TextWriter Output; + + public LeafListener(TextWriter output) { + Output = output; + } + public override void ExitA(TParser.AContext ctx) { if (ctx.ChildCount==2) { @@ -214,11 +226,11 @@ public class LeafListener : TBaseListener { } sb.Length = sb.Length - 2; sb.Append ("]"); - Console.Write ("{0} {1} {2}", ctx.INT (0).Symbol.Text, + Output.Write ("{0} {1} {2}", ctx.INT (0).Symbol.Text, ctx.INT (1).Symbol.Text, sb.ToString()); } else - Console.WriteLine(ctx.ID().Symbol); + Output.WriteLine(ctx.ID().Symbol); } } } @@ -227,12 +239,18 @@ public class LeafListener : TBaseListener { RuleGetterListener(X) ::= << @parser::members { public class LeafListener : TBaseListener { + private readonly TextWriter Output; + + public LeafListener(TextWriter output) { + Output = output; + } + public override void ExitA(TParser.AContext ctx) { if (ctx.ChildCount==2) { - Console.Write("{0} {1} {2}",ctx.b(0).Start.Text, + Output.Write("{0} {1} {2}",ctx.b(0).Start.Text, ctx.b(1).Start.Text,ctx.b()[0].Start.Text); } else - Console.WriteLine(ctx.b(0).Start.Text); + Output.WriteLine(ctx.b(0).Start.Text); } } } @@ -242,12 +260,18 @@ public class LeafListener : TBaseListener { LRListener(X) ::= << @parser::members { public class LeafListener : TBaseListener { + private readonly TextWriter Output; + + public LeafListener(TextWriter output) { + Output = output; + } + public override void ExitE(TParser.EContext ctx) { if (ctx.ChildCount==3) { - Console.Write("{0} {1} {2}\n",ctx.e(0).Start.Text, + Output.Write("{0} {1} {2}\n",ctx.e(0).Start.Text, ctx.e(1).Start.Text, ctx.e()[0].Start.Text); } else - Console.WriteLine(ctx.INT().Symbol.Text); + Output.WriteLine(ctx.INT().Symbol.Text); } } } @@ -256,11 +280,17 @@ public class LeafListener : TBaseListener { LRWithLabelsListener(X) ::= << @parser::members { public class LeafListener : TBaseListener { + private readonly TextWriter Output; + + public LeafListener(TextWriter output) { + Output = output; + } + public override void ExitCall(TParser.CallContext ctx) { - Console.Write("{0} {1}",ctx.e().Start.Text,ctx.eList()); + Output.Write("{0} {1}",ctx.e().Start.Text,ctx.eList()); } public override void ExitInt(TParser.IntContext ctx) { - Console.WriteLine(ctx.INT().Symbol.Text); + Output.WriteLine(ctx.INT().Symbol.Text); } } } @@ -274,12 +304,12 @@ void foo() { } >> -Declare_foo() ::= <> +Declare_foo() ::= <> Invoke_foo() ::= "this.foo();" Declare_pred() ::= < private int _syntaxErrors; - public Parser(ITokenStream input) + protected readonly TextWriter Output; + + public Parser(ITokenStream input) : this(input, Console.Out) { } + + public Parser(ITokenStream input, TextWriter output) { TokenStream = input; + Output = output; } /// reset the parser's state @@ -1143,10 +1155,10 @@ namespace Antlr4.Runtime { if (seenOne) { - System.Console.Out.WriteLine(); + Output.WriteLine(); } - System.Console.Out.WriteLine("Decision " + dfa.decision + ":"); - System.Console.Out.Write(dfa.ToString(Vocabulary)); + Output.WriteLine("Decision " + dfa.decision + ":"); + Output.Write(dfa.ToString(Vocabulary)); seenOne = true; } } diff --git a/tool/resources/org/antlr/v4/tool/templates/codegen/CSharp/CSharp.stg b/tool/resources/org/antlr/v4/tool/templates/codegen/CSharp/CSharp.stg index 6e9fa0f02..e219cd9ee 100644 --- a/tool/resources/org/antlr/v4/tool/templates/codegen/CSharp/CSharp.stg +++ b/tool/resources/org/antlr/v4/tool/templates/codegen/CSharp/CSharp.stg @@ -37,6 +37,7 @@ namespace { using System; +using System.IO; using System.Text; using System.Diagnostics; using System.Collections.Generic; @@ -357,8 +358,10 @@ case : return _sempred(()> parser_ctor(parser) ::= << -public (ITokenStream input) - : base(input) + public (ITokenStream input) : this(input, Console.Out) { } + + public (ITokenStream input, TextWriter output) + : base(input, output) { Interpreter = new ParserATNSimulator(this, _ATN, decisionToDFA, sharedContextCache); } @@ -958,6 +961,7 @@ namespace { using System; +using System.IO; using System.Text; using Antlr4.Runtime; using Antlr4.Runtime.Atn; @@ -1001,7 +1005,10 @@ public partial class : { public (ICharStream input) - : base(input) + : this(input, Console.Out) { } + + public (ICharStream input, TextWriter output) + : base(input, output) { Interpreter = new LexerATNSimulator(this, _ATN, decisionToDFA, sharedContextCache); }