main.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char* type_prefix = "OP_";
  5. char* indent_str = "\t";
  6. char* input_var = "s";
  7. char* output_var = "type";
  8. typedef struct conf {
  9. char* str;
  10. char* name;
  11. } conf;
  12. conf strings[] = {
  13. {"+", "PLUS"},
  14. {"-", "MINUS"},
  15. {"*", "MUL"},
  16. {"/", "DIV"},
  17. {"%", "MOD"},
  18. {"&", "BIT_AND"},
  19. {"|", "BIT_OR"},
  20. {"^", "BIT_XOR"},
  21. {"~", "BIT_NOT"},
  22. {"!", "LOGIC_NOT"},
  23. {"&&", "LOGIC_AND"},
  24. {"||", "LOGIC_OR"},
  25. {">", "GT"},
  26. {">=", "GTE"},
  27. {">>", "SHR"},
  28. {"<", "LT"},
  29. {"<=", "LTE"},
  30. {"<<", "SHL"},
  31. {"==", "EQ"},
  32. {"!=", "NEQ"},
  33. {"(", "LPAREN"},
  34. {")", "RPAREN"},
  35. {NULL, NULL},
  36. };
  37. typedef struct node {
  38. int c;
  39. char* name;
  40. struct node* kids;
  41. struct node* sibling;
  42. } node;
  43. node* mk_node(int c) {
  44. node* n = calloc(1, sizeof(*n));
  45. n->c = c;
  46. return n;
  47. }
  48. void add_str(node* n, char* s, char* name) {
  49. if(s[0] == 0) {
  50. if(n->name == NULL) {
  51. n->name = name;
  52. return;
  53. }
  54. printf("overlapping strings: %s, %s\n", name, n->name);
  55. }
  56. node* k = n->kids;
  57. while(k && k->c != s[0]) k = k->sibling;
  58. if(!k) {
  59. k = mk_node(s[0]);
  60. k->sibling = n->kids;
  61. n->kids = k;
  62. }
  63. add_str(k, s + 1, name);
  64. }
  65. void pi(int indent) {
  66. for(int i = 0; i < indent; i++) printf("%s", indent_str);
  67. }
  68. void print_lvl(node* n, int c_index, int indent) {
  69. pi(indent); printf("switch(%s[%d]) {\n", input_var, c_index);
  70. for(node* k = n->kids; k; k = k->sibling) {
  71. pi(indent + 1); printf("case '%c':", k->c);
  72. if(k->kids) {
  73. printf("\n");
  74. print_lvl(k, c_index + 1, indent + 2);
  75. pi(indent + 2); printf("break;\n");
  76. }
  77. else {
  78. printf(" %s = %s%s; break;\n", output_var, type_prefix, k->name);
  79. }
  80. }
  81. if(n->name) {
  82. pi(indent + 1); printf("default: %s = %s%s; break;\n", output_var, type_prefix, n->name);
  83. }
  84. pi(indent); printf("}\n");
  85. }
  86. int main() {
  87. // half-initialize the root to make life easier
  88. node* root = mk_node(strings[0].str[0]);
  89. for(conf* c = strings; c->str; c++) {
  90. add_str(root, c->str, c->name);
  91. }
  92. print_lvl(root, 0, 0);
  93. return 0;
  94. }