1313import java .util .*;
1414
1515public class LexerRunner {
16- static OutputStream os ;
16+ static OutputStream outputStream ;
1717
1818 private LexerRunner () {
1919 }
2020
2121 public static void main (String [] args ) {
2222 Config .get ().parseArguments (args );
23+ String inputFileName = Config .get ().getParam (Config .INPUT_FILE );
2324 String outputFileName = Config .get ().getParam (Config .OUTPUT_FILE );
24- os = outputFileName . isBlank () ? System . out : getOutputStream ( outputFileName );
25- Lexer lexer = new Lexer ( new SourceFileReader ( Config . get (). getParam ( Config . INPUT_FILE )) );
25+ Lexer lexer = new Lexer ( new SourceFileReader ( inputFileName ) );
26+ outputStream = outputFileName . isBlank () ? System . out : getOutputStream ( outputFileName );
2627 processTokens (lexer );
2728 }
2829
@@ -31,46 +32,53 @@ public static void main(String[] args) {
3132 * @param lexer The lexer to use
3233 */
3334 private static void processTokens (Lexer lexer ) {
34- List <String > header = new ArrayList <>();
35- List <List <String >> table = new ArrayList <>();
36- String headerMessage ;
35+ List <String > header = new ArrayList <>(); // Table header
36+ List <List <String >> table = new ArrayList <>(); // Table rows
3737 Language lang = Config .get ().getActiveLang ();
3838 try {
39- while (lexer .isNotEOF (lexer .peek ())) {
40- Token token = lexer .get ();
41- table .add (List .of (
42- String .valueOf (token .type ()),
43- String .valueOf (token .lexeme ()),
44- token .location ().row () + " (" + token .location ().column () + ")"
45- ));
46- }
47- // If no errors occurred, we can add the headers with the localized titles
48- headerMessage = lang .lexerOK ();
49- header .add (lang .token ());
50- header .add (lang .lexeme ());
51- header .add (lang .lineCol ());
52- Utils .outputTable (headerMessage , header , table , LexerRunner ::output );
39+ handleLexicalOK (lexer , header , table , lang );
5340 } catch (CompilerError e ) {
54- // If an error occurred, we can add the error headers with the localized titles
55- headerMessage = lang .lexError ();
56- header .add (lang .line ());
57- header .add (lang .column ());
58- header .add (lang .description ());
59- table .clear (); // Drop lexemes
60- table .add (List .of ( // Insert Error
61- String .valueOf (e .getStart ().row ()),
62- String .valueOf (e .getStart ().column ()),
63- e .getClass ().getSimpleName ()
41+ handleLexicalError (header , table , lang , e );
42+ }
43+ }
44+
45+ private static void handleLexicalOK (Lexer lexer , List <String > header , List <List <String >> table , Language lang ) {
46+ while (lexer .isNotEOF (lexer .peek ())) {
47+ Token token = lexer .get ();
48+ table .add (List .of (
49+ String .valueOf (token .type ()),
50+ String .valueOf (token .lexeme ()),
51+ token .location ().row () + " (" + token .location ().column () + ")"
6452 ));
65- Utils .outputTable (headerMessage , header , table , LexerRunner ::output );
66- output ("\n " );
67- output (e .getMessage ());
6853 }
54+ // If no errors occurred, we can add the headers with the localized titles
55+ String title = lang .lexerOK ();
56+ header .add (lang .token ());
57+ header .add (lang .lexeme ());
58+ header .add (lang .lineCol ());
59+ Utils .outputTable (title , header , table , LexerRunner ::output );
60+ }
61+
62+ private static void handleLexicalError (List <String > header , List <List <String >> table , Language lang , CompilerError e ) {
63+ // If an error occurred, we can add the error headers with the localized titles
64+ String title = lang .lexError ();
65+ header .add (lang .line ());
66+ header .add (lang .column ());
67+ header .add (lang .description ());
68+ table .clear (); // Drop lexemes
69+ table .add (List .of ( // Insert Error
70+ String .valueOf (e .getStart ().row ()),
71+ String .valueOf (e .getStart ().column ()),
72+ e .getClass ().getSimpleName ()
73+ ));
74+ Utils .outputTable (title , header , table , LexerRunner ::output );
75+ output ("\n " );
76+ output (e .getMessage ());
6977 }
7078
7179 private static void output (String s ) {
7280 try {
73- os .write (s .getBytes (StandardCharsets .UTF_8 ));
81+ outputStream .write (s .getBytes (StandardCharsets .UTF_8 ));
7482 } catch (IOException e ) {
7583 System .err .println ("Unexpected error during output :c" );
7684 e .printStackTrace ();
0 commit comments