tl_parse.c 7.8 KB

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