Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

156 lines
4.1KB

  1. #include <vslc.h>
  2. // Externally visible, for the generator
  3. extern tlhash_t *global_names;
  4. extern char **string_list;
  5. extern size_t n_string_list,stringc;
  6. /* External interface */
  7. void create_symbol_table(void);
  8. void print_symbol_table(void);
  9. void print_symbols(void);
  10. void print_bindings(node_t *root);
  11. void destroy_symbol_table(void);
  12. void find_globals(void);
  13. void bind_names(symbol_t *function, node_t *root);
  14. void destroy_symtab(void);
  15. void
  16. create_symbol_table ( void )
  17. {
  18. find_globals();
  19. size_t n_globals = tlhash_size ( global_names );
  20. symbol_t *global_list[n_globals];
  21. tlhash_values ( global_names, (void **)&global_list );
  22. for ( size_t i=0; i<n_globals; i++ )
  23. if ( global_list[i]->type == SYM_FUNCTION )
  24. bind_names ( global_list[i], global_list[i]->node );
  25. }
  26. void
  27. print_symbol_table ( void )
  28. {
  29. print_symbols();
  30. print_bindings(root);
  31. }
  32. void
  33. print_symbols ( void )
  34. {
  35. printf ( "String table:\n" );
  36. for ( size_t s=0; s<stringc; s++ )
  37. printf ( "%zu: %s\n", s, string_list[s] );
  38. printf ( "-- \n" );
  39. printf ( "Globals:\n" );
  40. size_t n_globals = tlhash_size(global_names);
  41. symbol_t *global_list[n_globals];
  42. tlhash_values ( global_names, (void **)&global_list );
  43. for ( size_t g=0; g<n_globals; g++ )
  44. {
  45. switch ( global_list[g]->type )
  46. {
  47. case SYM_FUNCTION:
  48. printf (
  49. "%s: function %zu:\n",
  50. global_list[g]->name, global_list[g]->seq
  51. );
  52. if ( global_list[g]->locals != NULL )
  53. {
  54. size_t localsize = tlhash_size( global_list[g]->locals );
  55. printf (
  56. "\t%zu local variables, %zu are parameters:\n",
  57. localsize, global_list[g]->nparms
  58. );
  59. symbol_t *locals[localsize];
  60. tlhash_values(global_list[g]->locals, (void **)locals );
  61. for ( size_t i=0; i<localsize; i++ )
  62. {
  63. printf ( "\t%s: ", locals[i]->name );
  64. switch ( locals[i]->type )
  65. {
  66. case SYM_PARAMETER:
  67. printf ( "parameter %zu\n", locals[i]->seq );
  68. break;
  69. case SYM_LOCAL_VAR:
  70. printf ( "local var %zu\n", locals[i]->seq );
  71. break;
  72. }
  73. }
  74. }
  75. break;
  76. case SYM_GLOBAL_VAR:
  77. printf ( "%s: global variable\n", global_list[g]->name );
  78. break;
  79. }
  80. }
  81. printf ( "-- \n" );
  82. }
  83. void
  84. print_bindings ( node_t *root )
  85. {
  86. if ( root == NULL )
  87. return;
  88. else if ( root->entry != NULL )
  89. {
  90. switch ( root->entry->type )
  91. {
  92. case SYM_GLOBAL_VAR:
  93. printf ( "Linked global var '%s'\n", root->entry->name );
  94. break;
  95. case SYM_FUNCTION:
  96. printf ( "Linked function %zu ('%s')\n",
  97. root->entry->seq, root->entry->name
  98. );
  99. break;
  100. case SYM_PARAMETER:
  101. printf ( "Linked parameter %zu ('%s')\n",
  102. root->entry->seq, root->entry->name
  103. );
  104. break;
  105. case SYM_LOCAL_VAR:
  106. printf ( "Linked local var %zu ('%s')\n",
  107. root->entry->seq, root->entry->name
  108. );
  109. break;
  110. }
  111. } else if ( root->type == STRING_DATA ) {
  112. size_t string_index = *((size_t *)root->data);
  113. if ( string_index < stringc )
  114. printf ( "Linked string %zu\n", *((size_t *)root->data) );
  115. else
  116. printf ( "(Not an indexed string)\n" );
  117. }
  118. for ( size_t c=0; c<root->n_children; c++ )
  119. print_bindings ( root->children[c] );
  120. }
  121. void
  122. destroy_symbol_table ( void )
  123. {
  124. destroy_symtab();
  125. }
  126. void
  127. find_globals ( void )
  128. {
  129. }
  130. void
  131. bind_names ( symbol_t *function, node_t *root )
  132. {
  133. }
  134. void
  135. destroy_symtab ( void )
  136. {
  137. }