カスタマイズ可能メソッド syntax_error()

CUP ファイルは、

import java_cup.runtime.*;

parser code {:
public void syntax_error(Symbol cur_token)
{
  System.out.println("syntax_error: " + cur_token);
}  

:};

terminal         A, EOL;

non terminal Object  input, line;

input   ::=
          | input line
          ;

line    ::= EOL
          | A EOL {: System.out.println("*a*"); :}
          | error EOL
          ;

Java ファイルは、

import java.io.*;
import java_cup.runtime.*;

class Lexer implements Scanner {
    private java.io.Reader yy_reader;

    Lexer(java.io.Reader in) {
        this.yy_reader = in;
    }
    Lexer(java.io.InputStream in) {
        this(new java.io.InputStreamReader(in));
    }

    private Symbol symbol(int type) {
        return new Symbol(type);
    }

    public Symbol next_token() throws java.io.IOException {
        int c = yy_reader.read();

        if (c < 0) {
            return symbol(sym.EOF);
        } else if (c == 'a') {
            return symbol(sym.A);
        } else if (c == '\n') {
            return symbol(sym.EOL);
        } else {
            return null;
        }
    }
}

class Main {
    static public void main(String argv[]) {
        parser p;

        try {
            if (argv.length > 0) {
                p = new parser(new Lexer(new FileReader(argv[0])));
            } else {
                p = new parser(new Lexer(new InputStreamReader(System.in)));
            }
            Object result = p.parse().value;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

で、

a
a
*a*
b
*a*
syntax_error: #3