/** * Copyright 2009, Google Inc. All rights reserved. * Licensed to PSF under a Contributor Agreement. */ package org.python.antlr; import org.antlr.runtime.ANTLRFileStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import org.python.antlr.ast.Name; import org.python.antlr.base.mod; import java.util.List; /** * Parser used by the indexer. */ public class AnalyzingParser extends BaseParser { public static class AnalyzerTreeAdaptor extends PythonTreeAdaptor { /** * Make sure a parenthesized {@link Name} expr has its start/stop bounds * set to the bounds of the identifier. */ @Override public void setTokenBoundaries(Object t, Token startToken, Token stopToken) { //XXX: should do this for all expr types, and have a prop list on Expr //that records all enclosing paren locations for IDE use cases. if (!(t instanceof Name) || startToken == null || stopToken == null || startToken.getType() != PythonParser.LPAREN || stopToken.getType() != PythonParser.RPAREN) { super.setTokenBoundaries(t, startToken, stopToken); } } } public AnalyzingParser(CharStream stream, String filename, String encoding) { super(stream, filename, encoding); errorHandler = new RecordingErrorHandler(); } public List<RecognitionException> getRecognitionErrors() { return ((RecordingErrorHandler)errorHandler).errs; } @Override protected PythonParser setupParser(boolean single) { PythonParser parser = super.setupParser(single); parser.setTreeAdaptor(new AnalyzerTreeAdaptor()); return parser; } public static void main(String[] args) { CharStream in = null; try { in = new ANTLRFileStream(args[0]); } catch (Exception x) { x.printStackTrace(); } AnalyzingParser p = new AnalyzingParser(in, args[0], "ascii"); mod ast = p.parseModule(); if (ast != null) { System.out.println("parse result: \n" + ast.toStringTree()); } else { System.out.println("failure: \n" + p.getRecognitionErrors()); } } }