Guest User

Untitled

a guest
Aug 17th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. enum Token
  6. {
  7. LEFT, RIGHT,
  8. PLUS, MINUS,
  9. READ, WRITE,
  10. LLOOP, RLOOP,
  11. };
  12.  
  13. struct TokenArray
  14. {
  15. enum Token *tokens;
  16. size_t len;
  17. size_t capacity;
  18. };
  19.  
  20. int newtokenarray(struct TokenArray **out)
  21. {
  22. enum Token *mem = malloc(sizeof(enum Token)*8);
  23. if (mem == NULL) return 1;
  24. struct TokenArray *array = malloc(sizeof(struct TokenArray));
  25. if (array == NULL) return 1;
  26. array->tokens = mem;
  27. array->len = 0;
  28. array->capacity = 8;
  29. *out = array;
  30. return 0;
  31. }
  32.  
  33. void pushtoken(struct TokenArray *array, enum Token token)
  34. {
  35. if (array->len + 1 > array->capacity)
  36. {
  37. void *new_ptr = realloc(array->tokens, array->capacity * 2); // Reallocate
  38. if (new_ptr == NULL)
  39. {
  40. printf("Panic: reallocation for TokenArray failed.");
  41. exit(1);
  42. }
  43. array->tokens = new_ptr;
  44. }
  45. array->tokens[array->len++] = token; // Add the token
  46. }
  47.  
  48. void cleanuptokenarray(struct TokenArray *array)
  49. {
  50. free(array->tokens);
  51. }
  52.  
  53. void tokenize(struct TokenArray **array, const char *input)
  54. {
  55. if (*array == NULL)
  56. newtokenarray(array);
  57.  
  58. size_t len = strlen(input);
  59. for (size_t i = 0; i < len; i++)
  60. {
  61. switch (input[i])
  62. {
  63. case '>':
  64. pushtoken(*array, RIGHT);
  65. break;
  66. case '<':
  67. pushtoken(*array, LEFT);
  68. break;
  69. case '+':
  70. pushtoken(*array, PLUS);
  71. break;
  72. case '-':
  73. pushtoken(*array, MINUS);
  74. break;
  75. case ',':
  76. pushtoken(*array, READ);
  77. break;
  78. case '.':
  79. pushtoken(*array, WRITE);
  80. break;
  81. case '[':
  82. pushtoken(*array, LLOOP);
  83. break;
  84. case ']':
  85. pushtoken(*array, RLOOP);
  86. break;
  87. default:
  88. break;
  89. }
  90. }
  91. }
  92.  
  93. void pushstr(char **dst, const char *src)
  94. {
  95. void *new_mem = realloc(*dst, strlen(*dst)+strlen(src)+2);
  96. if (new_mem == NULL)
  97. {
  98. printf("Panic: reallocation for pushstr failed.");
  99. exit(1);
  100. }
  101. *dst = new_mem;
  102. strcat(*dst, src);
  103. }
  104.  
  105. static char *preface = "#include <stdio.h>\n\nint main() {\n char tape[30000] = {0};\n char *ptr = tape;\n";
  106.  
  107. char *generatecode(const struct TokenArray *array)
  108. {
  109. char *output = malloc(sizeof(char)*(strlen(preface)+1));
  110. memcpy(output, preface, strlen(preface)+1);
  111.  
  112. unsigned indents = 1;
  113.  
  114. for (size_t i = 0; i < array->len; i++)
  115. {
  116. switch (array->tokens[i])
  117. {
  118. case RIGHT:
  119. for (unsigned t = 0; t < indents; t++)
  120. pushstr(&output, " ");
  121. pushstr(&output, "++ptr;\n");
  122. break;
  123. case LEFT:
  124. for (unsigned t = 0; t < indents; t++)
  125. pushstr(&output, " ");
  126. pushstr(&output, "--ptr;\n");
  127. break;
  128. case PLUS:
  129. for (unsigned t = 0; t < indents; t++)
  130. pushstr(&output, " ");
  131. pushstr(&output, "*++ptr;\n");
  132. break;
  133. case MINUS:
  134. for (unsigned t = 0; t < indents; t++)
  135. pushstr(&output, " ");
  136. pushstr(&output, "*--ptr;\n");
  137. break;
  138. case READ:
  139. for (unsigned t = 0; t < indents; t++)
  140. pushstr(&output, " ");
  141. pushstr(&output, "*ptr=getchar();\n");
  142. break;
  143. case WRITE:
  144. for (unsigned t = 0; t < indents; t++)
  145. pushstr(&output, " ");
  146. pushstr(&output, "putchar(*ptr);\n");
  147. break;
  148. case LLOOP:
  149. for (unsigned t = 0; t < indents; t++)
  150. pushstr(&output, " ");
  151. ++indents;
  152. pushstr(&output, "while (*ptr) {\n");
  153. break;
  154. case RLOOP:
  155. --indents;
  156. for (unsigned t = 0; t < indents; t++)
  157. pushstr(&output, " ");
  158. pushstr(&output, "}\n");
  159. break;
  160. }
  161. }
  162.  
  163. pushstr(&output, "}\n");
  164. return output;
  165. }
  166.  
  167. int main(int argc, char const *argv[])
  168. {
  169. struct TokenArray *tokens;
  170. newtokenarray(&tokens);
  171. tokenize(&tokens, "<><>");
  172. char *code = generatecode(tokens);
  173. printf("%s", code);
  174. cleanuptokenarray(tokens);
  175. free(code);
  176. return 0;
  177. }
Add Comment
Please, Sign In to add comment