KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > bnf > RuleList


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.bnf;
6
7 import java.util.ArrayList JavaDoc;
8 import java.util.HashMap JavaDoc;
9
10 public class RuleList implements Rule {
11
12     private boolean or;
13     private ArrayList JavaDoc list;
14     private boolean mapSet;
15     
16     RuleList(ArrayList JavaDoc list, boolean or) {
17         this.or = or;
18         this.list = list;
19     }
20     
21     RuleList(Rule first, Rule next, boolean or) {
22         list = new ArrayList JavaDoc();
23         if(first instanceof RuleList && ((RuleList)first).or == or) {
24             list.addAll(((RuleList)first).list);
25         } else {
26             list.add(first);
27         }
28         if(next instanceof RuleList && ((RuleList)next).or == or) {
29             list.addAll(((RuleList)next).list);
30         } else {
31             list.add(next);
32         }
33         if(!or && Bnf.COMBINE_KEYWORDS) {
34             for(int i=0; i<list.size()-1; i++) {
35                 Rule r1 = (Rule) list.get(i);
36                 Rule r2 = (Rule) list.get(i+1);
37                 if(!(r1 instanceof RuleElement) || !(r2 instanceof RuleElement)) {
38                     continue;
39                 }
40                 RuleElement re1 = (RuleElement) r1;
41                 RuleElement re2 = (RuleElement) r2;
42                 if(!re1.isKeyword() || !re2.isKeyword()) {
43                     continue;
44                 }
45                 re1 = re1.merge(re2);
46                 list.set(i, re1);
47                 list.remove(i+1);
48                 i--;
49             }
50         }
51         this.or = or;
52     }
53     
54     public String JavaDoc random(Bnf config, int level) {
55         if(or) {
56             if(level > 10) {
57                 if(level > 1000) {
58                     // better than stack overflow
59
throw new Error JavaDoc();
60                 }
61                 return get(0).random(config, level);
62             }
63             int idx = config.getRandom().nextInt(list.size());
64             return get(idx).random(config, level+1);
65         } else {
66             StringBuffer JavaDoc buff = new StringBuffer JavaDoc();
67             for(int i=0; i<list.size(); i++) {
68                 buff.append(get(i).random(config, level+1));
69             }
70             return buff.toString();
71         }
72     }
73     
74     private Rule get(int idx) {
75         return ((Rule)list.get(idx));
76     }
77
78     public String JavaDoc name() {
79         return null;
80     }
81
82     public Rule last() {
83         return get(list.size()-1);
84     }
85
86     public void setLinks(HashMap JavaDoc ruleMap) {
87         if(!mapSet) {
88             for(int i=0; i<list.size(); i++) {
89                 get(i).setLinks(ruleMap);
90             }
91             mapSet = true;
92         }
93     }
94     
95     public String JavaDoc matchRemove(String JavaDoc query, Sentence sentence) {
96         if(query.length()==0) {
97             return null;
98         }
99         if(or) {
100             for(int i=0; i<list.size(); i++) {
101                 String JavaDoc s = get(i).matchRemove(query, sentence);
102                 if(s != null) {
103                     return s;
104                 }
105             }
106             return null;
107         } else {
108             for(int i=0; i<list.size(); i++) {
109                 Rule r = get(i);
110                 query = r.matchRemove(query, sentence);
111                 if(query == null) {
112                     return null;
113                 }
114             }
115             return query;
116         }
117     }
118
119     public void addNextTokenList(String JavaDoc query, Sentence sentence) {
120         if(sentence.stop()) {
121             //
122
}
123         if(or) {
124             for(int i=0; i<list.size(); i++) {
125                 get(i).addNextTokenList(query, sentence);
126             }
127         } else {
128             for(int i=0; i<list.size(); i++) {
129                 Rule r = get(i);
130                 r.addNextTokenList(query, sentence);
131                 query = r.matchRemove(query, sentence);
132                 if(query == null) {
133                     break;
134                 }
135             }
136         }
137     }
138     
139 }
140
Popular Tags