カスタマイズ可能メソッド 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