PageRenderTime 26ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/sablecc-3.2/src/org/sablecc/sablecc/ResolveProdTransformIds.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 357 lines | 290 code | 40 blank | 27 comment | 55 complexity | 7ac18b497cc0adb1f1a912fcc267d64c MD5 | raw file
  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. * This file is part of SableCC. *
  3. * See the file "LICENSE" for copyright information and the *
  4. * terms and conditions for copying, distribution and *
  5. * modification of SableCC. *
  6. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  7. package org.sablecc.sablecc;
  8. import org.sablecc.sablecc.analysis.*;
  9. import org.sablecc.sablecc.node.*;
  10. import java.util.*;
  11. import java.io.*;
  12. /*
  13. * ResolveProdTransformIds
  14. *
  15. * This class computes semantic verifications for production transformations
  16. * in Production section. It makes sure that all transformations specified
  17. * for a production(prod {-> prod_transform1 prod_transform2 prod_transform3...})
  18. * are defined as production in the section Abstract Syntax Tree.
  19. */
  20. public class ResolveProdTransformIds extends DepthFirstAdapter
  21. {
  22. private ResolveAstIds transformIds;
  23. private LinkedList listElems;
  24. private String prod_name;
  25. public LinkedList listProdTransformList = new LinkedList();
  26. private LinkedList listProdTransformContainsList;
  27. //Map of production transformation element type. The key of this map
  28. //is the node of this element in the AST.
  29. public final Map prodTransformElemTypes = new TypedHashMap(
  30. NoCast.instance,
  31. StringCast.instance);
  32. //This map contains the same information as the other one just above.
  33. //But the keys for this map are String ("ProdName.ElemTransformationName")
  34. public final Map prodTransformElemTypesString = new TypedHashMap(
  35. StringCast.instance,
  36. StringCast.instance);
  37. //Map of Productions which transformations contains list elements.
  38. public Map mapProdTransformContainsList = new TypedTreeMap(
  39. StringComparator.instance,
  40. StringCast.instance,
  41. ListCast.instance);
  42. //Map of all Production transformations elements.
  43. public final Map prod_transforms = new TypedTreeMap(
  44. StringComparator.instance,
  45. StringCast.instance,
  46. NoCast.instance);
  47. public ResolveProdTransformIds(ResolveAstIds ids)
  48. {
  49. transformIds = ids;
  50. }
  51. public void caseAProd(final AProd production)
  52. {
  53. prod_name = (String)transformIds.astIds.names.get(production);
  54. AElem temp[] =
  55. (AElem [])production.getProdTransform().toArray(new AElem[0]);
  56. listProdTransformContainsList = new LinkedList();
  57. listElems = new LinkedList();
  58. if( temp.length > 1 )
  59. {
  60. listProdTransformList.add(prod_name);
  61. }
  62. for(int i=0; i<temp.length; i++)
  63. {
  64. ((PElem) temp[i]).apply(new DepthFirstAdapter()
  65. {
  66. public void caseAElem(AElem node)
  67. {
  68. String rname = node.getId().getText();
  69. String name = ResolveIds.name(rname);
  70. String elemName = null;
  71. if(node.getElemName() != null)
  72. {
  73. elemName = node.getElemName().getText();
  74. if( listElems.contains(elemName) )
  75. {
  76. error(node.getElemName(), elemName);
  77. }
  78. listElems.add(elemName);
  79. }
  80. else
  81. {
  82. if(listElems.contains(rname))
  83. {
  84. error(node.getId(), rname);
  85. }
  86. listElems.add(rname);
  87. }
  88. if( (node.getUnOp() != null) &&
  89. ( (node.getUnOp() instanceof AStarUnOp) ||
  90. (node.getUnOp() instanceof APlusUnOp) ) )
  91. {
  92. listProdTransformList.add(prod_name);
  93. if(node.getElemName() != null)
  94. {
  95. listProdTransformContainsList.add(elemName);
  96. }
  97. else
  98. {
  99. listProdTransformContainsList.add(node.getId().getText());
  100. }
  101. }
  102. if(node.getSpecifier() != null)
  103. {
  104. if(node.getSpecifier() instanceof ATokenSpecifier)
  105. {
  106. if(transformIds.astIds.tokens.get("T" + name) == null)
  107. {
  108. error2(node.getId(), "T" + name);
  109. }
  110. if(transformIds.astIds.ignTokens.get("T" + name) != null)
  111. {
  112. error3(node.getId(), "T" + name);
  113. }
  114. /*****************************************************/
  115. String type_name = name;
  116. if( (node.getUnOp() instanceof AStarUnOp) ||
  117. (node.getUnOp() instanceof AQMarkUnOp) )
  118. {
  119. type_name += "?";
  120. }
  121. if( (node.getUnOp() instanceof AStarUnOp) ||
  122. (node.getUnOp() instanceof APlusUnOp) )
  123. {
  124. prodTransformElemTypes.put(node, "LT" + type_name);
  125. if(elemName != null)
  126. {
  127. prodTransformElemTypesString.put(prod_name+"."+elemName, "LT" + type_name);
  128. }
  129. else
  130. {
  131. prodTransformElemTypesString.put(prod_name+"."+rname, "LT" + type_name);
  132. }
  133. }
  134. else
  135. {
  136. prodTransformElemTypes.put(node, "T" + type_name);
  137. if(elemName != null)
  138. {
  139. prodTransformElemTypesString.put(prod_name+"."+elemName, "T" + type_name);
  140. }
  141. else
  142. {
  143. prodTransformElemTypesString.put(prod_name+"."+rname, "T" + type_name);
  144. }
  145. }
  146. }
  147. else
  148. {
  149. if(transformIds.ast_prods.get("P" + name) == null)
  150. {
  151. error5(node.getId(), "P" + name);
  152. }
  153. /*****************************************************/
  154. String type_name = name;
  155. if( (node.getUnOp() instanceof AStarUnOp) ||
  156. (node.getUnOp() instanceof AQMarkUnOp) )
  157. {
  158. type_name += "?";
  159. }
  160. if( (node.getUnOp() instanceof AStarUnOp) ||
  161. (node.getUnOp() instanceof APlusUnOp) )
  162. {
  163. prodTransformElemTypes.put(node, "LP" + type_name);
  164. if(elemName != null)
  165. {
  166. prodTransformElemTypesString.put(prod_name+"."+elemName, "LP" + type_name);
  167. }
  168. else
  169. {
  170. prodTransformElemTypesString.put(prod_name+"."+rname, "LP" + type_name);
  171. }
  172. }
  173. else
  174. {
  175. prodTransformElemTypes.put(node, "P" + type_name);
  176. if(elemName != null)
  177. {
  178. prodTransformElemTypesString.put(prod_name+"."+elemName, "P" + type_name);
  179. }
  180. else
  181. {
  182. prodTransformElemTypesString.put(prod_name+"."+rname, "P" + type_name);
  183. }
  184. }
  185. }
  186. }
  187. else
  188. {
  189. Object token = transformIds.astIds.tokens.get("T" + name);
  190. Object ignToken = transformIds.astIds.ignTokens.get("T" + name);
  191. Object production = transformIds.astIds.prods.get("P" + name);
  192. Object ast_production = transformIds.ast_prods.get("P" + name);
  193. if((token == null) && (ast_production == null) && (production == null))
  194. {
  195. error2(node.getId(), "P" + name + " and T" + name );
  196. }
  197. //it seems to be a token
  198. if(token != null)
  199. {
  200. boolean bast_production = false;
  201. //if it's also a ast_production
  202. if(ast_production != null)
  203. {
  204. error4(node.getId(), "P" + name + " and T" + name);
  205. }
  206. /*****************************************************/
  207. String type_name = name;
  208. if( (node.getUnOp() instanceof AStarUnOp) ||
  209. (node.getUnOp() instanceof AQMarkUnOp) )
  210. {
  211. type_name += "?";
  212. }
  213. if( (node.getUnOp() instanceof AStarUnOp) ||
  214. (node.getUnOp() instanceof APlusUnOp) )
  215. {
  216. prodTransformElemTypes.put(node, "LT" + type_name);
  217. if(elemName != null)
  218. {
  219. prodTransformElemTypesString.put(prod_name+"."+elemName, "LT" + type_name);
  220. }
  221. else
  222. {
  223. prodTransformElemTypesString.put(prod_name+"."+rname, "LT" + type_name);
  224. }
  225. }
  226. else
  227. {
  228. prodTransformElemTypes.put(node, "T" + type_name);
  229. if(elemName != null)
  230. {
  231. prodTransformElemTypesString.put(prod_name+"."+elemName, "T" + type_name);
  232. }
  233. else
  234. {
  235. prodTransformElemTypesString.put(prod_name+"."+rname, "T" + type_name);
  236. }
  237. }
  238. }
  239. // The element is supposed to be a Production in section AST
  240. else
  241. {
  242. if(ast_production == null)
  243. {
  244. error5(node.getId(), node.getId().getText());
  245. }
  246. /*****************************************************/
  247. String type_name = name;
  248. if( (node.getUnOp() instanceof AStarUnOp) ||
  249. (node.getUnOp() instanceof AQMarkUnOp) )
  250. {
  251. type_name += "?";
  252. }
  253. if( (node.getUnOp() instanceof AStarUnOp) ||
  254. (node.getUnOp() instanceof APlusUnOp) )
  255. {
  256. prodTransformElemTypes.put(node, "LP" + type_name);
  257. if(elemName != null)
  258. {
  259. prodTransformElemTypesString.put(prod_name+"."+elemName, "LP" + type_name);
  260. }
  261. else
  262. {
  263. prodTransformElemTypesString.put(prod_name+"."+rname, "LP" + type_name);
  264. }
  265. }
  266. else
  267. {
  268. prodTransformElemTypes.put(node, "P" + type_name);
  269. if(elemName != null)
  270. {
  271. prodTransformElemTypesString.put(prod_name+"."+elemName, "P" + type_name);
  272. }
  273. else
  274. {
  275. prodTransformElemTypesString.put(prod_name+"."+rname, "P" + type_name);
  276. }
  277. }
  278. }
  279. }
  280. }
  281. }
  282. );
  283. }
  284. prod_transforms.put(prod_name, listElems);
  285. mapProdTransformContainsList.put(prod_name, listProdTransformContainsList);
  286. }
  287. private static void error(Token token, String name)
  288. {
  289. throw new RuntimeException(
  290. "[" + token.getLine() + "," + token.getPos() + "] " +
  291. "Redefinition of " + name + ".");
  292. }
  293. private static void error2(Token token, String name)
  294. {
  295. throw new RuntimeException(
  296. "[" + token.getLine() + "," + token.getPos() + "] " +
  297. name + " undefined.");
  298. }
  299. private static void error3(Token token, String name)
  300. {
  301. throw new RuntimeException(
  302. "[" + token.getLine() + "," + token.getPos() + "] " +
  303. name + " is ignored.");
  304. }
  305. private static void error4(Token token, String name)
  306. {
  307. throw new RuntimeException(
  308. "[" + token.getLine() + "," + token.getPos() + "] " +
  309. "ambiguous " + name + ".");
  310. }
  311. private static void error5(Token token, String name)
  312. {
  313. throw new RuntimeException(
  314. "[" + token.getLine() + "," + token.getPos() + "] " +
  315. name+ " must be a production defined in section AST.");
  316. }
  317. }