01: /*
02: * CodeElement.java
03: *
04: * This work is free software; you can redistribute it and/or modify
05: * it under the terms of the GNU General Public License as published
06: * by the Free Software Foundation; either version 2 of the License,
07: * or (at your option) any later version.
08: *
09: * This work is distributed in the hope that it will be useful, but
10: * WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: * General Public License for more details.
13: *
14: * You should have received a copy of the GNU General Public License
15: * along with this program; if not, write to the Free Software
16: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17: * USA
18: *
19: * As a special exception, the copyright holders of this library give
20: * you permission to link this library with independent modules to
21: * produce an executable, regardless of the license terms of these
22: * independent modules, and to copy and distribute the resulting
23: * executable under terms of your choice, provided that you also meet,
24: * for each linked independent module, the terms and conditions of the
25: * license of that module. An independent module is a module which is
26: * not derived from or based on this library. If you modify this
27: * library, you may extend this exception to your version of the
28: * library, but you are not obligated to do so. If you do not wish to
29: * do so, delete this exception statement from your version.
30: *
31: * Copyright (c) 2003 Per Cederberg. All rights reserved.
32: */
33:
34: package net.percederberg.grammatica.code;
35:
36: import java.io.PrintWriter;
37:
38: /**
39: * The abstract base class for all code elements. The code element
40: * classes handles some source code construct and allows printing and
41: * comparing it to other constructs.
42: *
43: * @author Per Cederberg, <per at percederberg dot net>
44: * @version 1.0
45: */
46: public abstract class CodeElement implements Comparable {
47:
48: /**
49: * Compares this object to another one. The comparison is based
50: * on the code element category, reporting equality between
51: * elements within the same category. Objects not being code
52: * elements will cause zero (0) to be returned.
53: *
54: * @param obj the object to compare to
55: *
56: * @return negative if this object preceeds the other one,
57: * zero (0) if the objects are equal, or
58: * positive if this object succeeds the other one
59: */
60: public int compareTo(Object obj) {
61: if (obj instanceof CodeElement) {
62: return category() - ((CodeElement) obj).category();
63: } else {
64: return 0;
65: }
66: }
67:
68: /**
69: * Returns a numeric category number for the code element. A lower
70: * category number implies that the code element should be placed
71: * before code elements with a higher category number within a
72: * declaration.
73: *
74: * @return the category number
75: */
76: public abstract int category();
77:
78: /**
79: * Prints the code element to the specified output stream.
80: *
81: * @param out the output stream
82: * @param style the code style to use
83: * @param indent the indentation level
84: */
85: public abstract void print(PrintWriter out, CodeStyle style,
86: int indent);
87: }
|