Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.47 KB | None | 0 0
  1. %{
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /* Some constants. */
  7.  
  8. /* These constants are used later in the code */
  9. #define SYMTABSIZE 50
  10. #define IDLENGTH 15
  11. #define NOTHING -1
  12. #define INDENTOFFSET 2
  13.  
  14. enum ParseTreeNodeType {PROGRAM, BLOCK, ID_VALUE, NUMBER_VALUE, DECLARATION_BLOCK, STATEMENT_LIST, FOR_STATEMENT,
  15. STATEMENT, IDENTIFIER_LIST, ASSIGNMENT_STATEMENT, IF_STATEMENT, READ_STATEMENT, OUTPUT_LIST, CONDITIONAL, NUMBER_CONSTANT,
  16. DO_STATEMENT, WHILE_STATEMENT, WRITE_STATEMENT, CONDITIONAL_CONDITION, COMPARATOR, EXPRESSION, TERM, VALUE, CONSTANT, TYPENODE,
  17. MINUS_CONSTANT, REAL_CONSTANT, MINUSREAL_CONSTANT};
  18.  
  19. char *NodeName[] = {"PROGRAM", "BLOCK", "ID_VALUE", "NUMBER_VALUE", "DECLARATION_BLOCK", "STATEMENT_LIST", "FOR_STATEMENT",
  20. "STATEMENT", "IDENTIFIER_LIST", "ASSIGNMENT_STATEMENT", "IF_STATEMENT", "READ_STATEMENT", "OUTPUT_LIST", "CONDITIONAL", "NUMBER_CONSTANT",
  21. "DO_STATEMENT", "WHILE_STATEMENT", "WRITE_STATEMENT", "CONDITIONAL_CONDITION", "COMPARATOR", "EXPRESSION", "TERM", "VALUE", "CONSTANT", "TYPENODE",
  22. "MINUS_CONSTANT", "REAL_CONSTANT", "MINUSREAL_CONSTANT"};
  23.  
  24. #ifndef TRUE
  25. #define TRUE 1
  26. #endif
  27.  
  28. #ifndef FALSE
  29. #define FALSE 0
  30. #endif
  31.  
  32. #ifndef NULL
  33. #define NULL 0
  34. #endif
  35.  
  36. /* ------------- parse tree definition --------------------------- */
  37.  
  38. struct treeNode {
  39. int item;
  40. int nodeIdentifier;
  41. struct treeNode *first;
  42. struct treeNode *second;
  43. struct treeNode *third;
  44. };
  45.  
  46. typedef struct treeNode TREE_NODE;
  47. typedef TREE_NODE *TERNARY_TREE;
  48.  
  49. /* ------------- forward declarations --------------------------- */
  50.  
  51. int evaluate(TERNARY_TREE);
  52. TERNARY_TREE create_node(int,int,TERNARY_TREE,TERNARY_TREE,TERNARY_TREE);
  53. void PrintTree(TERNARY_TREE);
  54. void CodeTree(TERNARY_TREE);
  55.  
  56. /* ------------- symbol table definition --------------------------- */
  57.  
  58. struct symTabNode {
  59. char identifier[IDLENGTH];
  60. };
  61.  
  62. typedef struct symTabNode SYMTABNODE;
  63. typedef SYMTABNODE *SYMTABNODEPTR;
  64.  
  65. SYMTABNODEPTR symTab[SYMTABSIZE];
  66.  
  67. int currentSymTabSize = 0;
  68.  
  69. %}
  70.  
  71. /****************/
  72. /* Start symbol */
  73. /****************/
  74.  
  75. %start program
  76.  
  77. /**********************/
  78. /* Action value types */
  79. /**********************/
  80.  
  81. %union
  82. {
  83. int iVal;
  84. TERNARY_TREE tVal;
  85. }
  86.  
  87. %token OF SEMICOLON COLON DECLARATIONS AND BY TO IS IF ENDIF THEN ELSE WHILE ENDWHILE DO ENDDO
  88. %token RIGHT NEWLINE READ WRITE TYPE OR FOR ENDFOR NOT CODE DECLARATION INTEGER REAL CHARACTER
  89. %token DIGIT LBRACKET RBRACKET FULLSTOP COMMA SINGLEQUOTE EQUALS TIMES DIVIDE PLUS MINUS LT GT
  90. %token LTET GTET NOTEQUALS ENDP ASSIGNMENT
  91.  
  92. %token<iVal> ID NUMBER REALCONSTANT CHARCONSTANT
  93. %type<tVal> program block declaration_block statement_list identifier_list statement type assignment_statement if_statement
  94. %type<tVal> do_statement for_statement write_statement read_statement output_list conditional conditional_condition comparator
  95. %type<tVal> expression term value constant number_constant while_statement
  96.  
  97. %%
  98. /* For tree rules, TOKEN = NOTHING */
  99.  
  100. program: ID COLON block ENDP ID FULLSTOP
  101. { TERNARY_TREE ParseTree;
  102. ParseTree = create_node($1, PROGRAM, $3, NULL, NULL);
  103. #ifdef DEBUG
  104. PrintTree(ParseTree);
  105. #else
  106. CodeTree(ParseTree);
  107. #endif
  108. }
  109.  
  110. block: DECLARATIONS declaration_block CODE statement_list
  111. {
  112. $$ = create_node(NOTHING,BLOCK,$2,NULL,$4);
  113. }
  114. | CODE statement_list
  115. {
  116. $$ = create_node(NOTHING,BLOCK,$2,NULL,NULL);
  117. }
  118.  
  119. ;
  120.  
  121. identifier_list: ID
  122. {
  123. $$ = create_node($1, IDENTIFIER_LIST, NULL, NULL, NULL);
  124. }
  125. | ID COMMA identifier_list
  126. {
  127. $$ = create_node($1, IDENTIFIER_LIST, $3, NULL, NULL);
  128. }
  129. ;
  130.  
  131. declaration_block: identifier_list OF TYPE type SEMICOLON
  132. {
  133. $$ = create_node(NOTHING, DECLARATION_BLOCK, $1, NULL, $4);
  134. }
  135. | declaration_block identifier_list OF TYPE type SEMICOLON
  136. {
  137. $$ = create_node(NOTHING, DECLARATION_BLOCK, $1, $2, NULL);
  138. }
  139. ;
  140.  
  141. type: CHARACTER
  142. {
  143. $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
  144. }
  145. | INTEGER
  146. {
  147. $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
  148. }
  149. | REAL
  150. {
  151. $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
  152. }
  153. ;
  154.  
  155. statement_list: statement
  156. {
  157. $$ = create_node(NOTHING,STATEMENT_LIST,$1,NULL,NULL);
  158. }
  159. |statement SEMICOLON statement_list
  160. {
  161. $$ = create_node(NOTHING, STATEMENT_LIST, $1, $3, NULL);
  162. }
  163. ;
  164.  
  165. statement: assignment_statement
  166. {
  167. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  168. }
  169. |if_statement
  170. {
  171. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  172. }
  173. |do_statement
  174. {
  175. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  176. }
  177. |while_statement
  178. {
  179. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  180. }
  181. |for_statement
  182. {
  183. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  184. }
  185. |write_statement
  186. {
  187. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  188. }
  189. |read_statement
  190. {
  191. $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
  192. }
  193. ;
  194.  
  195. assignment_statement: expression ASSIGNMENT ID
  196. {
  197. $$ = create_node($3, ASSIGNMENT_STATEMENT,$1,NULL,NULL);
  198. }
  199. ;
  200. if_statement: IF conditional THEN statement_list ENDIF
  201. {
  202. $$ = create_node(NOTHING,IF_STATEMENT,$2,NULL,$4);
  203. }
  204. | IF conditional THEN statement_list ELSE statement_list ENDIF
  205. {
  206. $$ = create_node(NOTHING,IF_STATEMENT,$2,$4,$6);
  207. }
  208. ;
  209.  
  210. do_statement: DO statement_list WHILE conditional ENDDO
  211. {
  212. $$ = create_node(NOTHING,DO_STATEMENT,$2,$4,NULL);
  213. }
  214.  
  215. while_statement: WHILE conditional DO statement_list ENDWHILE
  216. {
  217. $$ = create_node(NOTHING,WHILE_STATEMENT,$2,$4,NULL);
  218. }
  219.  
  220. for_statement: FOR ID IS expression BY expression TO expression DO statement_list ENDFOR
  221. {
  222. $$ = create_node($2,FOR_STATEMENT,$4,$6,$10);
  223. }
  224.  
  225. write_statement: WRITE LBRACKET output_list RBRACKET
  226. {
  227. $$ = create_node(NOTHING,WRITE_STATEMENT,$3,NULL,NULL);
  228. }
  229. | NEWLINE
  230. {
  231. $$ = create_node(NOTHING,WRITE_STATEMENT,NULL,NULL,NULL);
  232. }
  233. ;
  234.  
  235. read_statement: READ LBRACKET ID RBRACKET
  236. {
  237. $$ = create_node($3,READ_STATEMENT,NULL,NULL,NULL);
  238. }
  239. ;
  240. output_list: value
  241. {
  242. $$ = create_node(NOTHING,OUTPUT_LIST,$1,NULL,NULL);
  243. }
  244. | value COMMA output_list
  245. {
  246. $$ = create_node(NOTHING,OUTPUT_LIST,$1,$3,NULL);
  247. }
  248. ;
  249.  
  250. conditional: conditional_condition
  251. {
  252. $$ = create_node(NOTHING,CONDITIONAL,$1,NULL,NULL);
  253. }
  254. | conditional AND conditional_condition
  255. {
  256. $$ = create_node(NOTHING,CONDITIONAL,$1,$3,NULL);
  257. }
  258. | conditional OR conditional_condition
  259. {
  260. $$ = create_node(NOTHING,CONDITIONAL,$1,$3,NULL);
  261. }
  262. ;
  263. conditional_condition : expression comparator expression
  264. {
  265. $$ = create_node(NOTHING,CONDITIONAL_CONDITION,$1,$2,$3);
  266. }
  267. | NOT conditional_condition
  268. {
  269. $$ = create_node(NOTHING,CONDITIONAL_CONDITION,$2,NULL,NULL);
  270. }
  271. ;
  272. comparator: EQUALS
  273. {
  274. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  275. }
  276. | NOTEQUALS
  277. {
  278. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  279. }
  280. | LT
  281. {
  282. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  283. }
  284. | GT
  285. {
  286. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  287. }
  288. | LTET
  289. {
  290. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  291. }
  292. | GTET
  293. {
  294. $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
  295. }
  296. ;
  297.  
  298. expression: term
  299. {
  300. $$ = create_node(NOTHING,EXPRESSION,$1,NULL,NULL);
  301. }
  302. | expression PLUS term
  303. {
  304. $$ = create_node(NOTHING,EXPRESSION,$1,$3,NULL);
  305. }
  306. | expression MINUS term
  307. {
  308. $$ = create_node(NOTHING,EXPRESSION,$1,$3,NULL);
  309. }
  310. ;
  311. term: value
  312. {
  313. $$ = create_node(NOTHING,TERM,$1,NULL,NULL);
  314. }
  315. | term TIMES value
  316. {
  317. $$ = create_node(NOTHING,TERM,$1,$3,NULL);
  318. }
  319. | term DIVIDE value
  320. {
  321. $$ = create_node(NOTHING,TERM,$1,$3,NULL);
  322. }
  323. ;
  324. value: ID
  325. {
  326. $$ = create_node($1,VALUE,NULL,NULL,NULL);
  327. }
  328. | constant
  329. {
  330. $$ = create_node(NOTHING,VALUE,$1,NULL,NULL);
  331. }
  332. | LBRACKET expression RBRACKET
  333. {
  334. $$ = create_node(NOTHING,VALUE,$2,NULL,NULL);
  335. }
  336. ;
  337. constant: number_constant
  338. {
  339. $$ = create_node(NOTHING,CONSTANT,$1,NULL,NULL);
  340. }
  341. | CHARCONSTANT
  342. {
  343. $$ = create_node($1,CONSTANT,NULL,NULL,NULL);
  344. }
  345. ;
  346.  
  347. number_constant: NUMBER
  348. {
  349. $$ = create_node($1,NUMBER_CONSTANT,NULL,NULL,NULL);
  350. }
  351. | MINUS NUMBER
  352. {
  353. $$ = create_node($2,MINUS_CONSTANT,NULL,NULL,NULL);
  354. }
  355. | REALCONSTANT
  356. {
  357. $$ = create_node($1,REAL_CONSTANT,NULL,NULL,NULL);
  358. }
  359. | MINUS REALCONSTANT
  360. {
  361. $$ = create_node($2,MINUSREAL_CONSTANT,NULL,NULL,NULL);
  362. }
  363. ;
  364.  
  365. %%
  366.  
  367. /* Code for routines for managing the Parse Tree */
  368.  
  369. TERNARY_TREE create_node(int ival, int case_identifier, TERNARY_TREE p1,
  370. TERNARY_TREE p2, TERNARY_TREE p3)
  371. {
  372. TERNARY_TREE t;
  373. t = (TERNARY_TREE)malloc(sizeof(TREE_NODE));
  374. t->item = ival;
  375. t->nodeIdentifier = case_identifier;
  376. t->first = p1;
  377. t->second = p2;
  378. t->third = p3;
  379. return (t);
  380. }
  381.  
  382. void PrintTree(TERNARY_TREE t)
  383. {
  384. if (t == NULL) return;
  385. if (t->item != NOTHING)
  386. {
  387. if (t->nodeIdentifier == NUMBER_CONSTANT || t->nodeIdentifier == MINUS_CONSTANT)
  388. printf("Number: %d ", t->item);
  389. else if (t->nodeIdentifier == VALUE || t->nodeIdentifier == READ_STATEMENT
  390. || t->nodeIdentifier == FOR_STATEMENT || t->nodeIdentifier == ASSIGNMENT_STATEMENT
  391. || t->nodeIdentifier == REAL_CONSTANT || t->nodeIdentifier == MINUSREAL_CONSTANT)
  392. printf("Identifier: %s\n", symTab[t->item]->identifier);
  393. }
  394. if (t->nodeIdentifier < 0 || t ->nodeIdentifier > sizeof(NodeName))
  395. printf("Unknown NodeIdentifier: %d\n",t->nodeIdentifier);
  396. else
  397. printf("NodeIdentifier: %s\n",NodeName[t->nodeIdentifier]);
  398. PrintTree(t->first);
  399. PrintTree(t->second);
  400. PrintTree(t->third);
  401. }
  402.  
  403. void CodeTree(TERNARY_TREE t)
  404. {
  405. if (t == NULL) return;
  406. switch(t->nodeIdentifier)
  407. {
  408. case PROGRAM:
  409. printf("#include <stdio.h>\nint main(void)\n{\n");
  410. CodeTree(t->first);
  411. printf("}\n");
  412. break;
  413. case WRITE_STATEMENT:
  414. printf("printf(");
  415. if (t->first == NULL) printf("\"\\n\"");
  416. else
  417. {
  418. printf("\"");
  419. CodeTree(t->first);
  420. printf("\"");
  421. }
  422. printf(");\n");
  423. break;
  424. case CONSTANT:
  425. if (t->first == NULL) printf("%c",t->item);
  426. else
  427. CodeTree(t->first);
  428. break;
  429. default:
  430. CodeTree(t->first);
  431. CodeTree(t->second);
  432. CodeTree(t->third);
  433. }
  434.  
  435. }
  436. #include "lex.yy.c"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement