4444using System . Text ;
4545using System . Windows . Forms ;
4646
47+ using Antlr4 . Runtime ;
4748using Antlr4 . Runtime . Misc ;
4849
4950using CommandLine ;
5960using Org . Edgerunner . ANTLR4 . Tools . Testing . Grammar ;
6061using Org . Edgerunner . ANTLR4 . Tools . Testing . GrunDotNet . Properties ;
6162using Org . Edgerunner . ANTLR4 . Tools . Testing . GrunWin ;
63+ using Org . Edgerunner . ANTLR4 . Tools . Testing . GrunWin . Editor . SyntaxHighlighting ;
64+
65+ using Parser = CommandLine . Parser ;
6266
6367// ReSharper disable RedundantNameQualifier
6468namespace Org . Edgerunner . ANTLR4 . Tools . Testing . GrunDotNet
@@ -132,10 +136,50 @@ private static void Main(string[] args)
132136 }
133137 else
134138 {
139+ var analyzer = new Analyzer ( ) ;
140+ var builder = new StringBuilder ( ) ;
141+ var currentLine = Console . CursorTop ;
135142 Console . WriteLine ( Resources . ReadingFromStandardInputPromptMessage ) ;
136- string line ;
137- while ( ( line = Console . ReadLine ( ) ) != null )
138- data += line + Environment . NewLine ;
143+ while ( true )
144+ {
145+ var typed = Console . ReadKey ( true ) ;
146+
147+ if ( ( typed . Modifiers & ConsoleModifiers . Control ) == ConsoleModifiers . Control
148+ && typed . Key == ConsoleKey . Z )
149+ {
150+ Console . Write ( "^Z" ) ;
151+ break ;
152+ }
153+
154+ if ( typed . Key == ConsoleKey . Enter )
155+ {
156+ Console . WriteLine ( ) ;
157+ builder . Append ( "\r \n " ) ;
158+ }
159+ else if ( typed . Key == ConsoleKey . Backspace )
160+ {
161+ if ( Console . CursorLeft > 0 )
162+ {
163+ Console . Write ( typed . KeyChar ) ;
164+ Console . Write ( ' ' ) ;
165+ Console . Write ( typed . KeyChar ) ;
166+ builder . Remove ( builder . Length - 1 , 1 ) ;
167+ }
168+ }
169+ else
170+ {
171+ Console . Write ( typed . KeyChar ) ;
172+ builder . Append ( typed . KeyChar ) ;
173+ }
174+
175+ var grammarParser = analyzer . BuildParserWithOptions ( grammar , data , ParseOption . None ) ;
176+ grammarParser . RemoveErrorListeners ( ) ;
177+ analyzer . ExecuteParsing ( grammarParser , o . RuleName ) ;
178+ HighlightSyntaxInConsole ( currentLine , analyzer , null ) ;
179+ }
180+
181+ Console . WriteLine ( ) ;
182+ data = builder . ToString ( ) ;
139183 }
140184
141185 // If tokens are the only option we've received, we don't need to parse
@@ -153,7 +197,7 @@ private static void Main(string[] args)
153197 analyzer . ExecuteParsing ( grammarParser , o . RuleName ) ;
154198
155199 if ( showParseTree )
156- Console . WriteLine ( analyzer . ParseContext . ToStringTree ( grammarParser ) ) ;
200+ Console . WriteLine ( analyzer . ParserContext . ToStringTree ( grammarParser ) ) ;
157201
158202 if ( writeSvg )
159203 {
@@ -164,7 +208,7 @@ private static void Main(string[] args)
164208 BorderColor = _Settings . GraphNodeBorderColor . GetMsAglColor ( ) ,
165209 TextColor = _Settings . GraphNodeTextColor . GetMsAglColor ( )
166210 } ;
167- var graph = grapher . CreateGraph ( analyzer . ParseContext , rules . ToList ( ) ) ;
211+ var graph = grapher . CreateGraph ( analyzer . ParserContext , rules . ToList ( ) ) ;
168212 graph . LayoutAlgorithmSettings = new SugiyamaLayoutSettings ( ) ;
169213 GraphRenderer renderer = new GraphRenderer ( graph ) ;
170214 renderer . CalculateLayout ( ) ;
@@ -207,6 +251,39 @@ private static void Main(string[] args)
207251 }
208252 }
209253
254+ private static void HighlightSyntaxInConsole ( int lineOffset , Analyzer analyzer , IStyleRegistry registry )
255+ {
256+ return ;
257+
258+ if ( analyzer ? . ParserContext == null )
259+ return ;
260+
261+ if ( registry == null )
262+ return ;
263+
264+ var cursorRow = Console . CursorTop ;
265+ var cursorColumn = Console . CursorLeft ;
266+ foreach ( var token in analyzer . DisplayTokens )
267+ ColorToken ( token , lineOffset , registry ) ;
268+
269+ Console . SetCursorPosition ( cursorColumn , cursorRow ) ;
270+ }
271+
272+ private static void ColorToken ( SyntaxToken token , int lineOffset , IStyleRegistry registry )
273+ {
274+ var startLine = token . LineNumber + lineOffset ;
275+ var endLine = token . EndingLineNumber + lineOffset ;
276+ for ( int ln = startLine ; ln < endLine + 1 ; ln ++ )
277+ {
278+ for ( int col = token . ColumnPosition ; col < token . EndingColumnPosition + 1 ; col ++ )
279+ {
280+ Console . SetCursorPosition ( col , ln ) ;
281+
282+ // TODO: add syntax highlight logic.
283+ }
284+ }
285+ }
286+
210287 private static void DisplayTokens ( GrammarReference grammar , string data )
211288 {
212289 var analyzer = new Grammar . Analyzer ( ) ;
0 commit comments