KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fri > patterns > interpreter > parsergenerator > lexer > semantics > LexerReflectSemantic


1 package fri.patterns.interpreter.parsergenerator.lexer.semantics;
2
3 import java.util.*;
4 import java.lang.reflect.Method JavaDoc;
5 import fri.patterns.interpreter.parsergenerator.lexer.LexerSemantic;
6 import fri.patterns.interpreter.parsergenerator.lexer.ResultTree;
7 import fri.patterns.interpreter.parsergenerator.syntax.Rule;
8
9 /**
10  * A LexerSemantic that provides the Set of wanted String nonterminals
11  * by method reflection. Callback methods must be of the form
12  * <pre>
13  * public void EncodingDecl(ResultTree resultTree) {
14  * this.encodingDecl = resultTree.toString();
15  * }
16  * </pre>
17  *
18  * Created on 21.09.2005
19  * @author Fritz Ritzberger
20  */

21 public abstract class LexerReflectSemantic implements LexerSemantic
22 {
23     /**
24      * As expected, this method delegates to the method that is named like the
25      * nonterminal of the passed Rule, with <i>resultTree</i> as the only argument.
26      */

27     public void ruleEvaluated(Rule rule, ResultTree resultTree) {
28         try {
29             Method JavaDoc m = getClass().getMethod(rule.getNonterminal(), new Class JavaDoc[] { ResultTree.class });
30             m.setAccessible(true);
31             m.invoke(this, new Object JavaDoc[] { resultTree });
32         }
33         catch (Exception JavaDoc e) {
34             e.printStackTrace();
35         }
36     }
37
38     /**
39      * Provides the Set of wanted nonterminal Strings by searching for
40      * public void methods with (String, Token.Range) arguments.
41      */

42     public Set getWantedNonterminals() {
43         Method JavaDoc [] methods = getClass().getMethods();
44         Set set = new HashSet(methods.length);
45
46         for (int i = 0; i < methods.length; i++) {
47             Method JavaDoc m = methods[i];
48             Class JavaDoc [] argClasses = m.getParameterTypes();
49
50             if (m.getReturnType().equals(void.class) && argClasses.length == 1 && argClasses[0].equals(ResultTree.class)) {
51                 String JavaDoc name = m.getName();
52                 set.add(name);
53             }
54         }
55         return set;
56     }
57
58     /**
59      * Returns null as getWantedNonterminals() is provided.
60      */

61     public Set getIgnoredNonterminals() {
62         return null;
63     }
64
65 }
66
Popular Tags