tl_parse.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. /***** tl_spin: tl_parse.c *****/
  2. /* Copyright (c) 1995-2003 by Lucent Technologies, Bell Laboratories. */
  3. /* All Rights Reserved. This software is for educational purposes only. */
  4. /* No guarantee whatsoever is expressed or implied by the distribution of */
  5. /* this code. Permission is given to distribute this code provided that */
  6. /* this introductory message is not removed and no monies are exchanged. */
  7. /* Software written by Gerard J. Holzmann. For tool documentation see: */
  8. /* http://spinroot.com/ */
  9. /* Send all bug-reports and/or questions to: bugs@spinroot.com */
  10. /* Based on the translation algorithm by Gerth, Peled, Vardi, and Wolper, */
  11. /* presented at the PSTV Conference, held in 1995, Warsaw, Poland 1995. */
  12. #include "tl.h"
  13. extern int tl_yylex(void);
  14. extern int tl_verbose;
  15. int tl_yychar = 0;
  16. YYSTYPE tl_yylval;
  17. static Node *tl_formula(void);
  18. static Node *tl_factor(void);
  19. static Node *tl_level(int);
  20. static int prec[2][4] = {
  21. { U_OPER, V_OPER, 0, 0 }, /* left associative */
  22. { OR, AND, IMPLIES, EQUIV, }, /* left associative */
  23. };
  24. static Node *
  25. tl_factor(void)
  26. { Node *ptr = ZN;
  27. switch (tl_yychar) {
  28. case '(':
  29. ptr = tl_formula();
  30. if (tl_yychar != ')')
  31. tl_yyerror("expected ')'");
  32. tl_yychar = tl_yylex();
  33. break;
  34. case NOT:
  35. ptr = tl_yylval;
  36. tl_yychar = tl_yylex();
  37. ptr->lft = tl_factor();
  38. ptr = push_negation(ptr);
  39. break;
  40. case ALWAYS:
  41. tl_yychar = tl_yylex();
  42. ptr = tl_factor();
  43. #ifndef NO_OPT
  44. if (ptr->ntyp == FALSE
  45. || ptr->ntyp == TRUE)
  46. break; /* [] false == false */
  47. if (ptr->ntyp == V_OPER)
  48. { if (ptr->lft->ntyp == FALSE)
  49. break; /* [][]p = []p */
  50. ptr = ptr->rgt; /* [] (p V q) = [] q */
  51. }
  52. #endif
  53. ptr = tl_nn(V_OPER, False, ptr);
  54. break;
  55. #ifdef NXT
  56. case NEXT:
  57. tl_yychar = tl_yylex();
  58. ptr = tl_factor();
  59. if (ptr->ntyp == TRUE)
  60. break; /* X true = true */
  61. ptr = tl_nn(NEXT, ptr, ZN);
  62. break;
  63. #endif
  64. case EVENTUALLY:
  65. tl_yychar = tl_yylex();
  66. ptr = tl_factor();
  67. #ifndef NO_OPT
  68. if (ptr->ntyp == TRUE
  69. || ptr->ntyp == FALSE)
  70. break; /* <> true == true */
  71. if (ptr->ntyp == U_OPER
  72. && ptr->lft->ntyp == TRUE)
  73. break; /* <><>p = <>p */
  74. if (ptr->ntyp == U_OPER)
  75. { /* <> (p U q) = <> q */
  76. ptr = ptr->rgt;
  77. /* fall thru */
  78. }
  79. #endif
  80. ptr = tl_nn(U_OPER, True, ptr);
  81. break;
  82. case PREDICATE:
  83. ptr = tl_yylval;
  84. tl_yychar = tl_yylex();
  85. break;
  86. case TRUE:
  87. case FALSE:
  88. ptr = tl_yylval;
  89. tl_yychar = tl_yylex();
  90. break;
  91. }
  92. if (!ptr) tl_yyerror("expected predicate");
  93. #if 0
  94. printf("factor: ");
  95. tl_explain(ptr->ntyp);
  96. printf("\n");
  97. #endif
  98. return ptr;
  99. }
  100. static Node *
  101. bin_simpler(Node *ptr)
  102. { Node *a, *b;
  103. if (ptr)
  104. switch (ptr->ntyp) {
  105. case U_OPER:
  106. #ifndef NO_OPT
  107. if (ptr->rgt->ntyp == TRUE
  108. || ptr->rgt->ntyp == FALSE
  109. || ptr->lft->ntyp == FALSE)
  110. { ptr = ptr->rgt;
  111. break;
  112. }
  113. if (isequal(ptr->lft, ptr->rgt))
  114. { /* p U p = p */
  115. ptr = ptr->rgt;
  116. break;
  117. }
  118. if (ptr->lft->ntyp == U_OPER
  119. && isequal(ptr->lft->lft, ptr->rgt))
  120. { /* (p U q) U p = (q U p) */
  121. ptr->lft = ptr->lft->rgt;
  122. break;
  123. }
  124. if (ptr->rgt->ntyp == U_OPER
  125. && ptr->rgt->lft->ntyp == TRUE)
  126. { /* p U (T U q) = (T U q) */
  127. ptr = ptr->rgt;
  128. break;
  129. }
  130. #ifdef NXT
  131. /* X p U X q == X (p U q) */
  132. if (ptr->rgt->ntyp == NEXT
  133. && ptr->lft->ntyp == NEXT)
  134. { ptr = tl_nn(NEXT,
  135. tl_nn(U_OPER,
  136. ptr->lft->lft,
  137. ptr->rgt->lft), ZN);
  138. }
  139. #endif
  140. #endif
  141. break;
  142. case V_OPER:
  143. #ifndef NO_OPT
  144. if (ptr->rgt->ntyp == FALSE
  145. || ptr->rgt->ntyp == TRUE
  146. || ptr->lft->ntyp == TRUE)
  147. { ptr = ptr->rgt;
  148. break;
  149. }
  150. if (isequal(ptr->lft, ptr->rgt))
  151. { /* p V p = p */
  152. ptr = ptr->rgt;
  153. break;
  154. }
  155. /* F V (p V q) == F V q */
  156. if (ptr->lft->ntyp == FALSE
  157. && ptr->rgt->ntyp == V_OPER)
  158. { ptr->rgt = ptr->rgt->rgt;
  159. break;
  160. }
  161. /* p V (F V q) == F V q */
  162. if (ptr->rgt->ntyp == V_OPER
  163. && ptr->rgt->lft->ntyp == FALSE)
  164. { ptr->lft = False;
  165. ptr->rgt = ptr->rgt->rgt;
  166. break;
  167. }
  168. #endif
  169. break;
  170. case IMPLIES:
  171. #ifndef NO_OPT
  172. if (isequal(ptr->lft, ptr->rgt))
  173. { ptr = True;
  174. break;
  175. }
  176. #endif
  177. ptr = tl_nn(OR, Not(ptr->lft), ptr->rgt);
  178. ptr = rewrite(ptr);
  179. break;
  180. case EQUIV:
  181. #ifndef NO_OPT
  182. if (isequal(ptr->lft, ptr->rgt))
  183. { ptr = True;
  184. break;
  185. }
  186. #endif
  187. a = rewrite(tl_nn(AND,
  188. dupnode(ptr->lft),
  189. dupnode(ptr->rgt)));
  190. b = rewrite(tl_nn(AND,
  191. Not(ptr->lft),
  192. Not(ptr->rgt)));
  193. ptr = tl_nn(OR, a, b);
  194. ptr = rewrite(ptr);
  195. break;
  196. case AND:
  197. #ifndef NO_OPT
  198. /* p && (q U p) = p */
  199. if (ptr->rgt->ntyp == U_OPER
  200. && isequal(ptr->rgt->rgt, ptr->lft))
  201. { ptr = ptr->lft;
  202. break;
  203. }
  204. if (ptr->lft->ntyp == U_OPER
  205. && isequal(ptr->lft->rgt, ptr->rgt))
  206. { ptr = ptr->rgt;
  207. break;
  208. }
  209. /* p && (q V p) == q V p */
  210. if (ptr->rgt->ntyp == V_OPER
  211. && isequal(ptr->rgt->rgt, ptr->lft))
  212. { ptr = ptr->rgt;
  213. break;
  214. }
  215. if (ptr->lft->ntyp == V_OPER
  216. && isequal(ptr->lft->rgt, ptr->rgt))
  217. { ptr = ptr->lft;
  218. break;
  219. }
  220. /* (p U q) && (r U q) = (p && r) U q*/
  221. if (ptr->rgt->ntyp == U_OPER
  222. && ptr->lft->ntyp == U_OPER
  223. && isequal(ptr->rgt->rgt, ptr->lft->rgt))
  224. { ptr = tl_nn(U_OPER,
  225. tl_nn(AND, ptr->lft->lft, ptr->rgt->lft),
  226. ptr->lft->rgt);
  227. break;
  228. }
  229. /* (p V q) && (p V r) = p V (q && r) */
  230. if (ptr->rgt->ntyp == V_OPER
  231. && ptr->lft->ntyp == V_OPER
  232. && isequal(ptr->rgt->lft, ptr->lft->lft))
  233. { ptr = tl_nn(V_OPER,
  234. ptr->rgt->lft,
  235. tl_nn(AND, ptr->lft->rgt, ptr->rgt->rgt));
  236. break;
  237. }
  238. #ifdef NXT
  239. /* X p && X q == X (p && q) */
  240. if (ptr->rgt->ntyp == NEXT
  241. && ptr->lft->ntyp == NEXT)
  242. { ptr = tl_nn(NEXT,
  243. tl_nn(AND,
  244. ptr->rgt->lft,
  245. ptr->lft->lft), ZN);
  246. break;
  247. }
  248. #endif
  249. if (isequal(ptr->lft, ptr->rgt) /* (p && p) == p */
  250. || ptr->rgt->ntyp == FALSE /* (p && F) == F */
  251. || ptr->lft->ntyp == TRUE) /* (T && p) == p */
  252. { ptr = ptr->rgt;
  253. break;
  254. }
  255. if (ptr->rgt->ntyp == TRUE /* (p && T) == p */
  256. || ptr->lft->ntyp == FALSE) /* (F && p) == F */
  257. { ptr = ptr->lft;
  258. break;
  259. }
  260. /* (p V q) && (r U q) == p V q */
  261. if (ptr->rgt->ntyp == U_OPER
  262. && ptr->lft->ntyp == V_OPER
  263. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  264. { ptr = ptr->lft;
  265. break;
  266. }
  267. #endif
  268. break;
  269. case OR:
  270. #ifndef NO_OPT
  271. /* p || (q U p) == q U p */
  272. if (ptr->rgt->ntyp == U_OPER
  273. && isequal(ptr->rgt->rgt, ptr->lft))
  274. { ptr = ptr->rgt;
  275. break;
  276. }
  277. /* p || (q V p) == p */
  278. if (ptr->rgt->ntyp == V_OPER
  279. && isequal(ptr->rgt->rgt, ptr->lft))
  280. { ptr = ptr->lft;
  281. break;
  282. }
  283. /* (p U q) || (p U r) = p U (q || r) */
  284. if (ptr->rgt->ntyp == U_OPER
  285. && ptr->lft->ntyp == U_OPER
  286. && isequal(ptr->rgt->lft, ptr->lft->lft))
  287. { ptr = tl_nn(U_OPER,
  288. ptr->rgt->lft,
  289. tl_nn(OR, ptr->lft->rgt, ptr->rgt->rgt));
  290. break;
  291. }
  292. if (isequal(ptr->lft, ptr->rgt) /* (p || p) == p */
  293. || ptr->rgt->ntyp == FALSE /* (p || F) == p */
  294. || ptr->lft->ntyp == TRUE) /* (T || p) == T */
  295. { ptr = ptr->lft;
  296. break;
  297. }
  298. if (ptr->rgt->ntyp == TRUE /* (p || T) == T */
  299. || ptr->lft->ntyp == FALSE) /* (F || p) == p */
  300. { ptr = ptr->rgt;
  301. break;
  302. }
  303. /* (p V q) || (r V q) = (p || r) V q */
  304. if (ptr->rgt->ntyp == V_OPER
  305. && ptr->lft->ntyp == V_OPER
  306. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  307. { ptr = tl_nn(V_OPER,
  308. tl_nn(OR, ptr->lft->lft, ptr->rgt->lft),
  309. ptr->rgt->rgt);
  310. break;
  311. }
  312. /* (p V q) || (r U q) == r U q */
  313. if (ptr->rgt->ntyp == U_OPER
  314. && ptr->lft->ntyp == V_OPER
  315. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  316. { ptr = ptr->rgt;
  317. break;
  318. }
  319. #endif
  320. break;
  321. }
  322. return ptr;
  323. }
  324. static Node *
  325. tl_level(int nr)
  326. { int i; Node *ptr = ZN;
  327. if (nr < 0)
  328. return tl_factor();
  329. ptr = tl_level(nr-1);
  330. again:
  331. for (i = 0; i < 4; i++)
  332. if (tl_yychar == prec[nr][i])
  333. { tl_yychar = tl_yylex();
  334. ptr = tl_nn(prec[nr][i],
  335. ptr, tl_level(nr-1));
  336. ptr = bin_simpler(ptr);
  337. goto again;
  338. }
  339. if (!ptr) tl_yyerror("syntax error");
  340. #if 0
  341. printf("level %d: ", nr);
  342. tl_explain(ptr->ntyp);
  343. printf("\n");
  344. #endif
  345. return ptr;
  346. }
  347. static Node *
  348. tl_formula(void)
  349. { tl_yychar = tl_yylex();
  350. return tl_level(1); /* 2 precedence levels, 1 and 0 */
  351. }
  352. void
  353. tl_parse(void)
  354. { Node *n = tl_formula();
  355. if (tl_verbose)
  356. { printf("formula: ");
  357. dump(n);
  358. printf("\n");
  359. }
  360. trans(n);
  361. }