/first_version/datalog_parser.y

https://github.com/ftarin/datalogsolve · Happy · 402 lines · 320 code · 82 blank · 0 comment · 0 complexity · fa562505bab6c5fb334338398395f981 MD5 · raw file

  1. %{
  2. /******************************************************************************
  3. * C A E S A R _ D A T A L O G _ 1
  4. *-----------------------------------------------------------------------------
  5. * Technical University of Valencia
  6. * DSIC / ELP
  7. * Camino de Vera s/n
  8. * 46022 Valencia
  9. * SPAIN
  10. *-----------------------------------------------------------------------------
  11. * Module : %M%
  12. * Authors : Maria ALPUENTE, Marco FELIU, Christophe JOUBERT
  13. * and Alicia VILLANUEVA
  14. * Version : %R%.%L%
  15. * Date : %E% %U%
  16. *
  17. *****************************************************************************/
  18. #include <stdio.h>
  19. #include "datalog_basic_data_structures.h"
  20. #include "datalog_common.h"
  21. %}
  22. /* Keywords */
  23. %token _IS_IMPLIED_BY
  24. %token _END_OF_RULE
  25. %token _OPAR _CPAR _COMMA
  26. %token _COLON
  27. %token _DOMAIN_SECTION _RELATION_SECTION _RULE_SECTION
  28. /* Tokens */
  29. %token <CAESAR_DOMAIN_NAME> _DOMAIN_ID
  30. %token <CAESAR_NATURAL> _NUMBER
  31. %token <CAESAR_FILE_NAME> _FILENAME
  32. %token <CAESAR_IONATURE> _IONATURE
  33. %token <CAESAR_IDENTIFIER> _IDENTIFIER
  34. %token _IDENTIFIER2
  35. /* Grammar axiom */
  36. %start program
  37. %{
  38. #include "caesar_solve_1.h"
  39. #include "datalog_solve.h"
  40. #include "datalog_basic_data_structures.h"
  41. /* Global variables*/
  42. /* Domain list */
  43. extern CAESAR_TYPE_DOMAIN_LIST CAESAR_DATALOG_DOMAIN_LIST;
  44. /* Relation list */
  45. extern CAESAR_TYPE_RELATION_LIST CAESAR_DATALOG_RELATION_LIST;
  46. /* Rule list */
  47. extern CAESAR_TYPE_RULE_LIST CAESAR_DATALOG_RULE_LIST;
  48. /* Maximum number of relations on the right side of a rule's body */
  49. extern CAESAR_TYPE_NATURAL CAESAR_DATALOG_MAX_RULE_BODY_SIZE;
  50. extern int yylineno;
  51. extern char yytext[];
  52. void yyerror();
  53. %}
  54. /* Bison stack type */
  55. %union {
  56. char *NAIVE;
  57. CAESAR_TYPE_STRING CAESAR_IDENTIFIER;
  58. CAESAR_TYPE_STRING CAESAR_DOMAIN_NAME;
  59. CAESAR_TYPE_STRING CAESAR_FILE_NAME;
  60. CAESAR_TYPE_NATURAL CAESAR_NATURAL;
  61. CAESAR_TYPE_DOMAIN CAESAR_DOMAIN;
  62. CAESAR_TYPE_DOMAIN_LIST CAESAR_DOMAIN_LIST;
  63. CAESAR_TYPE_RELATION CAESAR_RELATION;
  64. CAESAR_TYPE_RELATION_LIST CAESAR_RELATION_LIST;
  65. CAESAR_TYPE_IONATURE CAESAR_IONATURE;
  66. CAESAR_TYPE_RULE_VARIABLE_LIST CAESAR_RULE_VARIABLE_LIST;
  67. CAESAR_TYPE_ATOM CAESAR_ATOM;
  68. CAESAR_TYPE_LITERAL CAESAR_LITERAL;
  69. CAESAR_TYPE_LITERAL_LIST CAESAR_LITERAL_LIST;
  70. CAESAR_TYPE_RULE CAESAR_RULE;
  71. CAESAR_TYPE_RULE_LIST CAESAR_RULE_LIST;
  72. }
  73. /* Non-terminals' types */
  74. %type <CAESAR_DOMAIN> domain
  75. %type <CAESAR_DOMAIN_LIST> domains
  76. %type <CAESAR_RELATION> relation
  77. %type <CAESAR_IONATURE> relation_end
  78. %type <CAESAR_RELATION_LIST> relations
  79. %type <CAESAR_DOMAIN_LIST> parameter_list parameter_tail
  80. %type <CAESAR_IDENTIFIER> term
  81. %type <CAESAR_RULE_VARIABLE_LIST> parenthesized_list argument_list argument_tail
  82. %type <CAESAR_ATOM> atom
  83. %type <CAESAR_LITERAL> literal
  84. %type <CAESAR_LITERAL_LIST> tail literal_list literal_tail
  85. %type <CAESAR_RULE> clause
  86. %type <CAESAR_RULE_LIST> rules
  87. %%
  88. /*============================================================================*/
  89. program :
  90. _DOMAIN_SECTION domains
  91. {
  92. /* We store the reversal of the DOMAIN_LIST */
  93. CAESAR_DATALOG_DOMAIN_LIST = CAESAR_REVERSE_DOMAIN_LIST($2);
  94. CAESAR_BEGIN_DEBUG(4) {
  95. CAESAR_PRINT_DOMAIN_LIST(CAESAR_DATALOG_DOMAIN_LIST);
  96. } CAESAR_END_DEBUG;
  97. }
  98. _RELATION_SECTION relations
  99. {
  100. /* We store the RELATION_LIST */
  101. CAESAR_DATALOG_RELATION_LIST = $5;
  102. CAESAR_BEGIN_DEBUG(4) {
  103. CAESAR_PRINT_RELATION_LIST(CAESAR_DATALOG_RELATION_LIST);
  104. } CAESAR_END_DEBUG;
  105. }
  106. _RULE_SECTION rules
  107. {
  108. /* We store the RULE_LIST */
  109. CAESAR_DATALOG_RULE_LIST = $8;
  110. CAESAR_BEGIN_DEBUG(4) {
  111. CAESAR_PRINT_RULE_LIST(CAESAR_DATALOG_RULE_LIST);
  112. } CAESAR_END_DEBUG;
  113. }
  114. ;
  115. /*============================================================================*/
  116. /* Domains' rules */
  117. domains :
  118. domain
  119. {
  120. /* Creates a DOMAIN_LIST with the first the DOMAIN */
  121. $$ = CAESAR_CONSTRUCT_DOMAIN_LIST($1,(CAESAR_TYPE_DOMAIN_LIST) NULL);
  122. }
  123. | domains domain
  124. {
  125. /* Adds the new CAESAR_TYPE_DOMAIN to the CAESAR_TYPE_DOMAIN_and propagates the DOMAIN_LIST*/
  126. $$ = CAESAR_CONSTRUCT_DOMAIN_LIST($2,$1);
  127. }
  128. ;
  129. /*----------------------------------------------------------------------------*/
  130. domain :
  131. _DOMAIN_ID
  132. _NUMBER _FILENAME
  133. {
  134. /* Creates a DOMAIN */
  135. $$ = CAESAR_CREATE_DOMAIN($1, $2, $3);
  136. }
  137. ;
  138. /*============================================================================*/
  139. relations :
  140. /* empty */
  141. {
  142. $$ = (CAESAR_TYPE_RELATION_LIST) NULL;
  143. }
  144. | relation relations
  145. {
  146. $$ = CAESAR_CONSTRUCT_RELATION_LIST($1, $2);
  147. }
  148. ;
  149. /*----------------------------------------------------------------------------*/
  150. relation : _IDENTIFIER _OPAR parameter_list
  151. {
  152. $<CAESAR_DOMAIN_LIST>$ = $3;
  153. }
  154. _CPAR relation_end
  155. {
  156. CAESAR_TYPE_NATURAL LIST_LENGTH;
  157. LIST_LENGTH = CAESAR_DOMAIN_LIST_LENGTH($<CAESAR_DOMAIN_LIST>4);
  158. $$ = CAESAR_CREATE_RELATION($1, LIST_LENGTH, $<CAESAR_DOMAIN_LIST>4, $6);
  159. }
  160. relation_end : _IONATURE
  161. {
  162. $$ = $1
  163. }
  164. |
  165. {
  166. $$ = CAESAR_OUTPUT;
  167. }
  168. ;
  169. /*----------------------------------------------------------------------------*/
  170. parameter_list :
  171. _IDENTIFIER _COLON _IDENTIFIER
  172. {
  173. CAESAR_TYPE_DOMAIN CAESAR_DOMAIN;
  174. CAESAR_DOMAIN = CAESAR_GET_DOMAIN_BY_VARIABLE_DOMAIN_NAME($3, CAESAR_DATALOG_DOMAIN_LIST);
  175. if (CAESAR_DOMAIN == NULL) {
  176. yyerror("Domain associated with a parameter non-existent");
  177. exit(1);
  178. }
  179. $<CAESAR_DOMAIN>$ = CAESAR_DOMAIN;
  180. }
  181. parameter_tail
  182. {
  183. $$ = CAESAR_CONSTRUCT_DOMAIN_LIST($<CAESAR_DOMAIN>4, $5);
  184. }
  185. ;
  186. /*----------------------------------------------------------------------------*/
  187. parameter_tail :
  188. /* empty */
  189. {
  190. /* Creates the empty DOMAIN_LIST */
  191. $$ = (CAESAR_TYPE_DOMAIN_LIST) NULL;
  192. }
  193. |
  194. _COMMA parameter_list
  195. {
  196. /* Propagation of the DOMAIN_LIST */
  197. $$ = $2;
  198. }
  199. ;
  200. /*----------------------------------------------------------------------------*/
  201. rules :
  202. /* empty */ /* TODO */
  203. {
  204. $$ = (CAESAR_TYPE_RULE_LIST) NULL;
  205. }
  206. |
  207. clause rules
  208. {
  209. $$ = (CAESAR_TYPE_RULE_LIST) CAESAR_CONSTRUCT_RULE_LIST($1, $2);
  210. }
  211. ;
  212. /*----------------------------------------------------------------------------*/
  213. clause : atom tail _END_OF_RULE
  214. {
  215. CAESAR_TYPE_NATURAL CURRENT_BODY_SIZE;
  216. $$ = (CAESAR_TYPE_RULE) CAESAR_CREATE_RULE($1, $2);
  217. CURRENT_BODY_SIZE = CAESAR_LITERAL_LIST_LENGTH($2);
  218. if (CAESAR_DATALOG_MAX_RULE_BODY_SIZE < CURRENT_BODY_SIZE)
  219. CAESAR_DATALOG_MAX_RULE_BODY_SIZE = CURRENT_BODY_SIZE ;
  220. }
  221. ;
  222. /*----------------------------------------------------------------------------*/
  223. literal : _IDENTIFIER parenthesized_list
  224. {
  225. CAESAR_TYPE_RELATION RELATION;
  226. RELATION = (CAESAR_TYPE_RELATION) CAESAR_GET_RELATION_BY_RELATION_NAME($1, CAESAR_DATALOG_RELATION_LIST);
  227. $$ = (CAESAR_TYPE_LITERAL) CAESAR_CREATE_LITERAL(RELATION, $2);
  228. }
  229. ;
  230. /*----------------------------------------------------------------------------*/
  231. atom : _IDENTIFIER parenthesized_list
  232. {
  233. CAESAR_TYPE_RELATION RELATION;
  234. RELATION = (CAESAR_TYPE_RELATION) CAESAR_GET_RELATION_BY_RELATION_NAME($1, CAESAR_DATALOG_RELATION_LIST);
  235. if (RELATION == NULL) {
  236. yyerror("Head relation non-declared");
  237. exit(1);
  238. } else if (RELATION->ARITY != CAESAR_RULE_VARIABLE_LIST_LENGTH($2)) {
  239. yyerror("The no. of arguments of the head doesn't match its previous declaration");
  240. exit(1);
  241. }
  242. $$ = (CAESAR_TYPE_ATOM) CAESAR_CREATE_ATOM(RELATION, $2);
  243. }
  244. ;
  245. /*----------------------------------------------------------------------------*/
  246. parenthesized_list :
  247. _OPAR argument_list _CPAR
  248. {
  249. /* Propagation of the RULE_VARIABLE_LIST */
  250. $$ = $2;
  251. CAESAR_BEGIN_DEBUG(4) {
  252. CAESAR_PRINT_RULE_VARIABLE_LIST_NAMES($2);
  253. } CAESAR_END_DEBUG;
  254. }
  255. ;
  256. /*----------------------------------------------------------------------------*/
  257. argument_list : term argument_tail
  258. {
  259. /* */
  260. $$ = (CAESAR_TYPE_RULE_VARIABLE_LIST) CAESAR_CONSTRUCT_RULE_VARIABLE_LIST($1, $2);
  261. }
  262. ;
  263. /*----------------------------------------------------------------------------*/
  264. argument_tail :
  265. /* empty */
  266. {
  267. /* Creates the empty DOMAIN_LIST */
  268. $$ = (CAESAR_TYPE_RULE_VARIABLE_LIST) NULL;
  269. }
  270. |
  271. _COMMA argument_list
  272. {
  273. /* Propagation of the RULE_VARIABLE_LIST */
  274. $$ = $2;
  275. }
  276. ;
  277. /*----------------------------------------------------------------------------*/
  278. term : _IDENTIFIER /* TODO */
  279. {
  280. /* Propagation of the RULE_VARIABLE name */
  281. $$ = $1;
  282. }
  283. ;
  284. /*----------------------------------------------------------------------------*/
  285. tail :
  286. /* empty *//* TODO */
  287. {
  288. $$ = (CAESAR_TYPE_LITERAL_LIST) NULL;
  289. }
  290. |
  291. _IS_IMPLIED_BY literal_list
  292. {
  293. $$ = $2;
  294. }
  295. ;
  296. /*----------------------------------------------------------------------------*/
  297. literal_list : literal literal_tail
  298. {
  299. $$ = (CAESAR_TYPE_LITERAL_LIST) CAESAR_CONSTRUCT_LITERAL_LIST($1, $2);
  300. }
  301. ;
  302. /*----------------------------------------------------------------------------*/
  303. literal_tail :
  304. /* empty */
  305. {
  306. $$ = (CAESAR_TYPE_LITERAL_LIST) NULL;
  307. }
  308. |
  309. _COMMA literal_list
  310. {
  311. $$ = $2;
  312. }
  313. ;
  314. /*----------------------------------------------------------------------------*/
  315. %%
  316. void yyerror(char *caesar_s)
  317. {
  318. (void) fflush(stdout);
  319. (void) fprintf(stdout, "\nline %d: %s at or near \"%s\"\n", yylineno, caesar_s, yytext);
  320. }