%header {: package parser; import AST.*; :}; %embed {: class Events extends Parser.Events { public void scannerError(Scanner.Exception e) { errors.add(new Problem(null, e.getMessage(), e.line, e.column, Problem.Severity.ERROR, Problem.Kind.LEXICAL)); } public void syntaxError(Symbol token) { int line = Symbol.getLine(token.getStart()); int column = Symbol.getColumn(token.getStart()); int endLine = Symbol.getLine(token.getEnd()); int endColumn = Symbol.getColumn(token.getEnd()); String value = token.value != null ? token.value.toString() : Terminals.NAMES[token.getId()]; errors.add(new Problem(null, "unexpected token \"" + value + "\"", line, column, endLine, endColumn, Problem.Severity.ERROR, Problem.Kind.SYNTACTIC)); } public void unexpectedTokenRemoved(Symbol token) { } public void missingTokenInserted(Symbol token) { } public void misspelledTokenReplaced(Symbol token) { } public void errorPhraseRemoved(Symbol error) { } } { report = new Events(); // Use error handler in parser } public CompilationUnit parse(java.io.InputStream is, String fileName) throws java.io.IOException, beaver.Parser.Exception { CompilationUnit cu; errors = new ArrayList(); try { scanner.JavaScanner scanner = new scanner.JavaScanner(new scanner.Unicode(is)); cu = (CompilationUnit)parse(scanner); cu.setComments(scanner.comments()); cu.setOffsets(scanner.offsets()); } catch(Parser.Exception e) { // build empty compilation unit for failed error recovery cu = new CompilationUnit(); } for(java.util.Iterator iter = errors.iterator(); iter.hasNext(); ) { Problem p = (Problem)iter.next(); p.setFileName(fileName); cu.addParseError(p); } return cu; } protected java.util.Collection errors = new ArrayList(); :};