01: package kawa.lang;
02:
03: import gnu.mapping.*;
04: import gnu.expr.*;
05: import gnu.lists.*;
06: import gnu.text.Printable;
07:
08: /**
09: * Abstract class for "syntax" objects.
10: * Builtins and macros are instances of this class.
11: * @author Per Bothner
12: */
13:
14: abstract public class Syntax implements Printable, Named {
15: Object name;
16:
17: public final String getName() {
18: return name == null ? null
19: : name instanceof Symbol ? ((Symbol) name).getName()
20: : name.toString();
21: }
22:
23: public Object getSymbol() {
24: return name;
25: }
26:
27: public void setName(Object name) {
28: this .name = name;
29: }
30:
31: public void setName(String name) {
32: this .name = name;
33: }
34:
35: public Syntax() {
36: }
37:
38: public Syntax(Object name) {
39: setName(name);
40: }
41:
42: /**
43: * Re-write an expression that is an "application" of this Syntax object.
44: * @param obj the arguments to this "application" (i.e. the cdr of
45: * the macro/builtin invokation)
46: * @param tr the Translator that provides context
47: * @return the re-written expression
48: */
49:
50: public Expression rewrite(Object obj, Translator tr) {
51: throw new InternalError("rewrite method not defined");
52: }
53:
54: public Expression rewriteForm(Object form, Translator tr) {
55: if (form instanceof Pair)
56: return rewriteForm((Pair) form, tr);
57: else
58: return tr.syntaxError("non-list form for " + this );
59: }
60:
61: public Expression rewriteForm(Pair form, Translator tr) {
62: return rewrite(form.cdr, tr);
63: }
64:
65: public void scanForm(Pair st, ScopeExp defs, Translator tr) {
66: boolean ok = scanForDefinitions(st, tr.formStack, defs, tr);
67: if (!ok)
68: tr.formStack.add(new ErrorExp("syntax error expanding "
69: + this ));
70: }
71:
72: /** Check if a statement is a definition, for initial pass.
73: * Semi-deprecated - should convert calls to use scanForm.
74: * @param st the statement to check
75: * @param forms where to append the (possibly-modified) statement
76: * @param defs where to add Declarations for found definitions
77: * @param tr the compilation state
78: * @return true on success
79: */
80: public boolean scanForDefinitions(Pair st, java.util.Vector forms,
81: ScopeExp defs, Translator tr) {
82: forms.addElement(st);
83: return true;
84: }
85:
86: public void print(Consumer out) {
87: out.write("#<syntax ");
88: String name = this .getName();
89: out.write(name == null ? "<unnamed>" : name);
90: out.write('>');
91: }
92: }
|