Advertisement
Guest User

Untitled

a guest
May 27th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. TREES.C
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #define NUMB 256
  5. #define NODE 257
  6. #define INS 258
  7. #define Lf 259
  8. extern int yylval;
  9.  
  10.  
  11. int symbol;
  12. typedef struct _node {
  13. int key;
  14. struct _node *l, *r;
  15. }node;
  16.  
  17. node *T();
  18. node *E();
  19. void print_tree(node *, int);
  20. node *insert_node(int, node *);
  21.  
  22.  
  23. void next_symbol() {
  24. symbol = yylex();
  25. }
  26.  
  27. void error() {
  28. printf("Syntax error\n");
  29. }
  30.  
  31.  
  32.  
  33. void parser()
  34. {
  35. node *n = (node *)malloc(sizeof(node));
  36. n->key = 10;
  37. n->l = NULL;
  38. n->r = NULL;
  39. print_tree(E(), 0);
  40. if (symbol != '\n')
  41. error();
  42. }
  43.  
  44. node *E() {
  45. node *res;
  46. if (symbol == INS) {
  47. next_symbol();
  48. res = (node *)malloc(sizeof(node));
  49. if (symbol == NUMB) {
  50. int toInsert = yylval;
  51. next_symbol();
  52. res = E();
  53. node *insertRes = (node *)malloc(sizeof(node));
  54. insertRes = insert_node(toInsert, res);
  55. return insertRes;
  56. }
  57. }
  58. else
  59. if (symbol == '(') {
  60. next_symbol();
  61. node *res2 = (node *)malloc(sizeof(node));
  62. res2 = E();
  63. if (symbol == ')') {
  64. next_symbol();
  65. }
  66. else
  67. error();
  68. return res2;
  69. }
  70. else
  71. if (symbol == NODE)
  72. return T();
  73.  
  74. return res;
  75.  
  76. }
  77.  
  78. node *T() {
  79. node *res;
  80. if (symbol == NODE) {
  81. next_symbol();
  82. res = (node *)malloc(sizeof(node));
  83. res->l = T();
  84. if (symbol == NUMB) {
  85. res->key = yylval;
  86. next_symbol();
  87. res->r = T();
  88. }
  89. return res;
  90. }
  91. else {
  92. if (symbol == Lf) {
  93. next_symbol();
  94. return NULL;
  95. }
  96. else {
  97. if (symbol == '(') {
  98. next_symbol();
  99. res = T();
  100. if (symbol == ')') {
  101. next_symbol();
  102. }
  103. else
  104. error();
  105. }
  106. else
  107. error();
  108.  
  109. return res;
  110. }
  111. }
  112. }
  113.  
  114.  
  115.  
  116. void print_tree(node *tree, int level) {
  117. if (tree != NULL) {
  118. int i;
  119. for (i = 0; i < level; i++)
  120. printf("\t");
  121. printf("%d\n", tree->key);
  122. print_tree(tree->l, level + 1);
  123. print_tree(tree->r, level + 1);
  124. }
  125. }
  126.  
  127. node *insert_node(int nr, node *tree) {
  128. if (tree == NULL) {
  129. tree = (node *)malloc(sizeof(node));
  130. tree-> key = nr;
  131. tree->l = NULL;
  132. tree->r = NULL;
  133. return tree;
  134. } else {
  135. if (nr < tree->key) {
  136. tree->l = insert_node(nr, tree->l);
  137. return tree;
  138. }
  139.  
  140. else {
  141. tree->r = insert_node(nr, tree->r);
  142. return tree;
  143.  
  144. }
  145.  
  146. }
  147. }
  148.  
  149. void main() {
  150. next_symbol();
  151. while (symbol != 0) {
  152. parser();
  153. next_symbol();
  154. }
  155. }
  156.  
  157.  
  158.  
  159.  
  160.  
  161. -----------------------------------------------------------
  162. TREES.L
  163. %{
  164. #include <stdlib.h>
  165. #include <stdio.h>
  166.  
  167. #define NUMB 256
  168. #define NODE 257
  169. #define ins 258
  170. #define Lf 289
  171. int yylval;
  172. %}
  173.  
  174. %%
  175.  
  176. [+()\n] { return *yytext; }
  177.  
  178. [0-9]+ { yylval = atoi(yytext);
  179. return NUMB; }
  180.  
  181. "Node" { return NODE; }
  182. "insert" { return ins; }
  183. "Lf" { return Lf; }
  184.  
  185. %%
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement