Parsing.java
上传用户:xiaozhuqw
上传日期:2021-11-10
资源大小:21k
文件大小:7k
源码类别:

词法分析

开发平台:

Java

  1. import java.io.*;
  2. import java.util.*;
  3. import javax.swing.tree.DefaultMutableTreeNode;
  4. public class Parsing {
  5. Hashtable rules;
  6. List edges;
  7. double sProb;
  8. public Parsing() {
  9. rules = new Hashtable();
  10. edges = new ArrayList();
  11. }
  12. public String BottomUp(String fileName) throws IOException {
  13. String result = new String();
  14. String r = new String();
  15. try {
  16. this.ReadRules("f:/上下文无关rule.txt");
  17. } catch (IOException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. //String fileName = new String("f:/yuliao.txt");
  22. BufferedReader in = new BufferedReader(new FileReader(fileName));
  23. String s;
  24. while ((s = in.readLine()) != null) {
  25. // System.out.println(s);
  26. long start = System.currentTimeMillis(); // 获取最初时间
  27. r = this.ProbParseOne(s);
  28. long end = System.currentTimeMillis(); // 获取运行结束时间
  29. System.out.println("程序运行时间1: " + (end - start) + "ms");
  30. this.edges = new ArrayList();
  31. System.out.println(r);
  32. result += r;
  33. }
  34. in.close();
  35. // String msg;
  36. return result;
  37. }
  38. public void ReadRules(String fileName) throws IOException {
  39. BufferedReader in = new BufferedReader(new FileReader(fileName));
  40. String s;
  41. while ((s = in.readLine()) != null) {
  42. Key key = new Key(s);
  43. Value value = new Value(s);
  44. this.putHashNode(key, value);
  45. }
  46. in.close();
  47. }
  48. void putHashNode(Key key, Value value) {
  49. ArrayList valueList;
  50. valueList = (ArrayList) rules.get(key);
  51. if (valueList == null) {
  52. valueList = new ArrayList();
  53. valueList.add(value);
  54. rules.put(key, valueList);
  55. } else {
  56. valueList.add(value);
  57. }
  58. }
  59. public String ProbParseOne(String s) {
  60. int i, j, wn = 0; // wn是语句S中词的个数
  61. int pId; // 该局部分析的序号
  62. String w;
  63. ProbEdge e = new ProbEdge();
  64. // ProbRules r = new ProbRules();
  65. Vector theRs = new Vector();
  66. Value v;
  67. while (s.length() > 0) { // 输入句不为空时
  68. wn++;
  69. i = s.indexOf(" ");
  70. if (i < 0) {
  71. w = s;
  72. s = new String();
  73. } else {
  74. w = s.substring(0, i);
  75. s = s.substring(i + 1);
  76. s.trim();
  77. }
  78. // 添加该局部分析
  79. pId = edges.size();
  80. e = new ProbEdge(w, wn, pId);
  81. edges.add(e);
  82. // 运用提升规则
  83. theRs = new Vector();
  84. theRs.add(e.GetRoot());
  85. ArrayList valueList = this.getProbRules(theRs);
  86. if (valueList != null) {
  87. // r = (ProbRules) rules.get(rId);
  88. // edges.add(new ProbEdge(e, pId, this.rules, rId, this.edges));
  89. for (int k = 0; k < valueList.size(); k++) {
  90. v = (Value) valueList.get(k);
  91. pId = edges.size();
  92. edges.add(new ProbEdge(e, v, pId));
  93. }
  94. }
  95. }
  96. for (j = 1; j <= wn; j++)
  97. // 运用提升规则、捆绑规则添加局部分析
  98. for (i = 1; i + j <= wn; i++) {
  99. // System.out.println(i + " " + j);
  100. InsertEdges(i, i + j, wn);
  101. }
  102. String t = this.getProbTrees(wn); // 构造带概率的分析串
  103. //tRoot = this.getProbTrees2(wn);
  104. return t; // 输出分析结果
  105. }
  106. public List find(int first, int last, List edgeList, int wn) {
  107. ProbEdge e, e0, e1;
  108. int pId;
  109. Vector theRs;
  110. ArrayList valueList;
  111. Value value;
  112. for (int i = 0; i < edges.size(); i++) {
  113. e0 = (ProbEdge) edges.get(i);
  114. if (e0.first != first)
  115. continue;
  116. if (e0.first == first && e0.last == last) {
  117. // 匹配处理,无需添加到链表
  118. edgeList.add(e0);
  119. theRs = new Vector();
  120. for (int j = 0; j < edgeList.size(); j++) {
  121. e1 = (ProbEdge) edgeList.get(j);
  122. theRs.add(e1.GetRoot());
  123. }
  124. valueList = this.getProbRules(theRs);
  125. // 匹配不成功
  126. if (valueList == null) {
  127. edgeList.remove(edgeList.size() - 1);
  128. continue;
  129. }
  130. for (int k = 0; k < valueList.size(); k++) {
  131. value = (Value) valueList.get(k);
  132. pId = edges.size();
  133. e = new ProbEdge(edgeList, value, pId);
  134. // 若没有完全分析完已归约出S则不加入局部分析表中
  135. if (!(e.GetRoot().equals("S") && (e.first != 1 || e.last != wn))) {
  136. // 需要剪枝则代替原有局部分析,在isPruning(e)中实现
  137. // 不需要剪枝则加入当前局部分析
  138. if (!isPruning(e))
  139. edges.add(e);
  140. }
  141. }
  142. // 匹配列表最后一项删除
  143. edgeList.remove(edgeList.size() - 1);
  144. continue;
  145. }
  146. if (e0.first == first && e0.last < last) {
  147. // 添加该E
  148. edgeList.add(e0);
  149. edgeList = find(e0.last + 1, last, edgeList, wn);
  150. }
  151. }
  152. if (edgeList.size() > 0)
  153. edgeList.remove(edgeList.size() - 1);
  154. return edgeList; // 返回
  155. }
  156. boolean isPruning(ProbEdge e) {
  157. ProbEdge e2;
  158. for (int k = edges.size() - 1; k >= 0; k--) {
  159. e2 = (ProbEdge) edges.get(k);
  160. if (e2.first != e.first || e2.last != e.last)// 起点和终点不同即可结束查找(因为跟e的起点、终点相同的局部分析必然连续排列)
  161. break;
  162. if (e2.GetRoot().equals(e.GetRoot())) {
  163. if (e.insideProb > e2.insideProb) {
  164. e2.root = e.root;
  165. e2.insideProb = e.insideProb;
  166. e2.child = e.child;
  167. return true;
  168. }
  169. if (e.insideProb < e2.insideProb)
  170. return true;
  171. }// if
  172. }// for
  173. return false;
  174. }
  175. public void InsertEdges(int first, int last, int wn) {
  176. List edgeList = new ArrayList();
  177. edgeList = find(first, last, edgeList, wn);
  178. }
  179. public String getProbTrees(int wid) // 获取分析结果
  180. {
  181. String s = new String();
  182. String temp;
  183. ProbEdge e;
  184. // double sInsideProb = 0.0;
  185. for (int i = 0; i < edges.size(); i++) {
  186. e = (ProbEdge) edges.get(i);
  187. if (e.first == 1 && e.last == wid && e.GetRoot().equals("S"))
  188. s += "n" + new Double(e.insideProb).toString() + ": "
  189. + this.getOneTree(e) + "nn"; // 添加该局部分析结果
  190. }
  191. int n = edges.size();
  192. temp = new String("局部分析" + n + "个");
  193. if (s == null)
  194. s = temp + "句子不合法";
  195. else
  196. s = temp + s;
  197. return s;
  198. }
  199. public String getOneTree(ProbEdge e) // 获取一棵分析树
  200. {
  201. String s = e.root;
  202. int index;
  203. if (e.child.isEmpty()) {
  204. return s;
  205. }
  206. s += " ( ";
  207. int i = 0;
  208. // 添加第一棵子树
  209. index = ((Integer) e.child.get(i)).intValue();
  210. s += this.getOneTree((ProbEdge) edges.get(index));
  211. i++;
  212. // 添加除首尾两棵子树外的中间段子树
  213. for (; i < e.child.size(); i++) {
  214. index = ((Integer) e.child.get(i)).intValue();
  215. s += " + " + this.getOneTree((ProbEdge) edges.get(index));
  216. }
  217. s += " )";
  218. return s;
  219. }
  220. public ArrayList getProbRules(Vector theRs) {
  221. Key key;
  222. ArrayList valueList;
  223. key = new Key(theRs);
  224. //System.out.println(key.toString());
  225. valueList = (ArrayList) rules.get(key);
  226. //System.out.println(valueList.toString());
  227. return valueList;
  228. }
  229. public static void main(String[] args) {
  230. Parsing p = new Parsing();
  231. try {
  232. p.BottomUp("ddd");
  233. } catch (IOException e) {
  234. // TODO Auto-generated catch block
  235. e.printStackTrace();
  236. }
  237. }
  238. }