home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 20 / AACD20.BIN / AACD / Programming / Jikes / Source / src / dump.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-24  |  12.9 KB  |  340 lines

  1. // $Id: dump.cpp,v 1.15 2001/01/14 09:56:31 mdejong Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10.  
  11. #include "platform.h"
  12. #include "javasym.h"
  13. #include "control.h"
  14. #include "stream.h"
  15.  
  16. /*
  17. //FIXME: need to readdress this include stuff
  18. #include <iostream.h>
  19. #include <stdio.h>
  20. */
  21.  
  22.  
  23. #ifdef JIKES_DEBUG
  24.  
  25. #ifdef    HAVE_JIKES_NAMESPACE
  26. namespace Jikes {    // Open namespace Jikes block
  27. #endif
  28.  
  29. static char*
  30.       TK_notoken_STRING      = "TK_notoken",
  31.       TK_Identifier_STRING[] = "TK_Identifier",
  32.       TK_abstract_STRING[] = "TK_abstract",
  33.       TK_boolean_STRING[] = "TK_boolean",
  34.       TK_break_STRING[] = "TK_break",
  35.       TK_byte_STRING[] = "TK_byte",
  36.       TK_case_STRING[] = "TK_case",
  37.       TK_catch_STRING[] = "TK_catch",
  38.       TK_char_STRING[] = "TK_char",
  39.       TK_class_STRING[] = "TK_class",
  40.       TK_const_STRING[] = "TK_const",
  41.       TK_continue_STRING[] = "TK_continue",
  42.       TK_default_STRING[] = "TK_default",
  43.       TK_do_STRING[] = "TK_do",
  44.       TK_double_STRING[] = "TK_double",
  45.       TK_else_STRING[] = "TK_else",
  46.       TK_extends_STRING[] = "TK_extends",
  47.       TK_false_STRING[] = "TK_false",
  48.       TK_final_STRING[] = "TK_final",
  49.       TK_finally_STRING[] = "TK_finally",
  50.       TK_float_STRING[] = "TK_float",
  51.       TK_for_STRING[] = "TK_for",
  52.       TK_goto_STRING[] = "TK_goto",
  53.       TK_if_STRING[] = "TK_if",
  54.       TK_implements_STRING[] = "TK_implements",
  55.       TK_import_STRING[] = "TK_import",
  56.       TK_instanceof_STRING[] = "TK_instanceof",
  57.       TK_int_STRING[] = "TK_int",
  58.       TK_interface_STRING[] = "TK_interface",
  59.       TK_long_STRING[] = "TK_long",
  60.       TK_native_STRING[] = "TK_native",
  61.       TK_new_STRING[] = "TK_new",
  62.       TK_null_STRING[] = "TK_null",
  63.       TK_package_STRING[] = "TK_package",
  64.       TK_private_STRING[] = "TK_private",
  65.       TK_protected_STRING[] = "TK_protected",
  66.       TK_public_STRING[] = "TK_public",
  67.       TK_return_STRING[] = "TK_return",
  68.       TK_short_STRING[] = "TK_short",
  69.       TK_static_STRING[] = "TK_static",
  70.       TK_super_STRING[] = "TK_super",
  71.       TK_switch_STRING[] = "TK_switch",
  72.       TK_synchronized_STRING[] = "TK_synchronized",
  73.       TK_this_STRING[] = "TK_this",
  74.       TK_throw_STRING[] = "TK_throw",
  75.       TK_throws_STRING[] = "TK_throws",
  76.       TK_transient_STRING[] = "TK_transient",
  77.       TK_true_STRING[] = "TK_true",
  78.       TK_try_STRING[] = "TK_try",
  79.       TK_void_STRING[] = "TK_void",
  80.       TK_volatile_STRING[] = "TK_volatile",
  81.       TK_while_STRING[] = "TK_while",
  82.       TK_IntegerLiteral_STRING[] = "TK_IntegerLiteral",
  83.       TK_LongLiteral_STRING[] = "TK_LongLiteral",
  84.       TK_FloatingPointLiteral_STRING[] = "TK_FloatingPointLiteral",
  85.       TK_DoubleLiteral_STRING[] = "TK_DoubleLiteral",
  86.       TK_CharacterLiteral_STRING[] = "TK_CharacterLiteral",
  87.       TK_StringLiteral_STRING[] = "TK_StringLiteral",
  88.       TK_PLUS_PLUS_STRING[] = "TK_PLUS_PLUS",
  89.       TK_MINUS_MINUS_STRING[] = "TK_MINUS_MINUS",
  90.       TK_EQUAL_EQUAL_STRING[] = "TK_EQUAL_EQUAL",
  91.       TK_LESS_EQUAL_STRING[] = "TK_LESS_EQUAL",
  92.       TK_GREATER_EQUAL_STRING[] = "TK_GREATER_EQUAL",
  93.       TK_NOT_EQUAL_STRING[] = "TK_NOT_EQUAL",
  94.       TK_LEFT_SHIFT_STRING[] = "TK_LEFT_SHIFT",
  95.       TK_RIGHT_SHIFT_STRING[] = "TK_RIGHT_SHIFT",
  96.       TK_UNSIGNED_RIGHT_SHIFT_STRING[] = "TK_UNSIGNED_RIGHT_SHIFT",
  97.       TK_PLUS_EQUAL_STRING[] = "TK_PLUS_EQUAL",
  98.       TK_MINUS_EQUAL_STRING[] = "TK_MINUS_EQUAL",
  99.       TK_MULTIPLY_EQUAL_STRING[] = "TK_MULTIPLY_EQUAL",
  100.       TK_DIVIDE_EQUAL_STRING[] = "TK_DIVIDE_EQUAL",
  101.       TK_AND_EQUAL_STRING[] = "TK_AND_EQUAL",
  102.       TK_OR_EQUAL_STRING[] = "TK_OR_EQUAL",
  103.       TK_XOR_EQUAL_STRING[] = "TK_XOR_EQUAL",
  104.       TK_REMAINDER_EQUAL_STRING[] = "TK_REMAINDER_EQUAL",
  105.       TK_LEFT_SHIFT_EQUAL_STRING[] = "TK_LEFT_SHIFT_EQUAL",
  106.       TK_RIGHT_SHIFT_EQUAL_STRING[] = "TK_RIGHT_SHIFT_EQUAL",
  107.       TK_UNSIGNED_RIGHT_SHIFT_EQUAL_STRING[] = "TK_UNSIGNED_RIGHT_SHIFT_EQUAL",
  108.       TK_OR_OR_STRING[] = "TK_OR_OR",
  109.       TK_AND_AND_STRING[] = "TK_AND_AND",
  110.       TK_PLUS_STRING[] = "TK_PLUS",
  111.       TK_MINUS_STRING[] = "TK_MINUS",
  112.       TK_NOT_STRING[] = "TK_NOT",
  113.       TK_REMAINDER_STRING[] = "TK_REMAINDER",
  114.       TK_XOR_STRING[] = "TK_XOR",
  115.       TK_AND_STRING[] = "TK_AND",
  116.       TK_MULTIPLY_STRING[] = "TK_MULTIPLY",
  117.       TK_OR_STRING[] = "TK_OR",
  118.       TK_TWIDDLE_STRING[] = "TK_TWIDDLE",
  119.       TK_DIVIDE_STRING[] = "TK_DIVIDE",
  120.       TK_GREATER_STRING[] = "TK_GREATER",
  121.       TK_LESS_STRING[] = "TK_LESS",
  122.       TK_LPAREN_STRING[] = "TK_LPAREN",
  123.       TK_RPAREN_STRING[] = "TK_RPAREN",
  124.       TK_LBRACE_STRING[] = "TK_LBRACE",
  125.       TK_RBRACE_STRING[] = "TK_RBRACE",
  126.       TK_LBRACKET_STRING[] = "TK_LBRACKET",
  127.       TK_RBRACKET_STRING[] = "TK_RBRACKET",
  128.       TK_SEMICOLON_STRING[] = "TK_SEMICOLON",
  129.       TK_QUESTION_STRING[] = "TK_QUESTION",
  130.       TK_COLON_STRING[] = "TK_COLON",
  131.       TK_COMMA_STRING[] = "TK_COMMA",
  132.       TK_DOT_STRING[] = "TK_DOT",
  133.       TK_EQUAL_STRING[] = "TK_EQUAL",
  134.       TK_ERROR_STRING[] = "TK_ERROR",
  135.       TK_EOF_STRING[] = "TK_EOF",
  136.       TK_EOL_STRING[] = "TK_EOL";
  137.  
  138. static char *token_type(unsigned char kind)
  139. {
  140.     switch(kind)
  141.     {
  142.     case TK_Identifier: return TK_Identifier_STRING;
  143.     case TK_abstract: return TK_abstract_STRING;
  144.     case TK_boolean: return TK_boolean_STRING;
  145.     case TK_break: return TK_break_STRING;
  146.     case TK_byte: return TK_byte_STRING;
  147.     case TK_case: return TK_case_STRING;
  148.     case TK_catch: return TK_catch_STRING;
  149.     case TK_char: return TK_char_STRING;
  150.     case TK_class: return TK_class_STRING;
  151.     case TK_const: return TK_const_STRING;
  152.     case TK_continue: return TK_continue_STRING;
  153.     case TK_default: return TK_default_STRING;
  154.     case TK_do: return TK_do_STRING;
  155.     case TK_double: return TK_double_STRING;
  156.     case TK_else: return TK_else_STRING;
  157.     case TK_extends: return TK_extends_STRING;
  158.     case TK_false: return TK_false_STRING;
  159.     case TK_final: return TK_final_STRING;
  160.     case TK_finally: return TK_finally_STRING;
  161.     case TK_float: return TK_float_STRING;
  162.     case TK_for: return TK_for_STRING;
  163.     case TK_goto: return TK_goto_STRING;
  164.     case TK_if: return TK_if_STRING;
  165.     case TK_implements: return TK_implements_STRING;
  166.     case TK_import: return TK_import_STRING;
  167.     case TK_instanceof: return TK_instanceof_STRING;
  168.     case TK_int: return TK_int_STRING;
  169.     case TK_interface: return TK_interface_STRING;
  170.     case TK_long: return TK_long_STRING;
  171.     case TK_native: return TK_native_STRING;
  172.     case TK_new: return TK_new_STRING;
  173.     case TK_null: return TK_null_STRING;
  174.     case TK_package: return TK_package_STRING;
  175.     case TK_private: return TK_private_STRING;
  176.     case TK_protected: return TK_protected_STRING;
  177.     case TK_public: return TK_public_STRING;
  178.     case TK_return: return TK_return_STRING;
  179.     case TK_short: return TK_short_STRING;
  180.     case TK_static: return TK_static_STRING;
  181.     case TK_super: return TK_super_STRING;
  182.     case TK_switch: return TK_switch_STRING;
  183.     case TK_synchronized: return TK_synchronized_STRING;
  184.     case TK_this: return TK_this_STRING;
  185.     case TK_throw: return TK_throw_STRING;
  186.     case TK_throws: return TK_throws_STRING;
  187.     case TK_transient: return TK_transient_STRING;
  188.     case TK_true: return TK_true_STRING;
  189.     case TK_try: return TK_try_STRING;
  190.     case TK_void: return TK_void_STRING;
  191.     case TK_volatile: return TK_volatile_STRING;
  192.     case TK_while: return TK_while_STRING;
  193.     case TK_IntegerLiteral: return TK_IntegerLiteral_STRING;
  194.     case TK_LongLiteral: return TK_LongLiteral_STRING;
  195.     case TK_FloatingPointLiteral: return TK_FloatingPointLiteral_STRING;
  196.     case TK_DoubleLiteral: return TK_DoubleLiteral_STRING;
  197.     case TK_CharacterLiteral: return TK_CharacterLiteral_STRING;
  198.     case TK_StringLiteral: return TK_StringLiteral_STRING;
  199.     case TK_PLUS_PLUS: return TK_PLUS_PLUS_STRING;
  200.     case TK_MINUS_MINUS: return TK_MINUS_MINUS_STRING;
  201.     case TK_EQUAL_EQUAL: return TK_EQUAL_EQUAL_STRING;
  202.     case TK_LESS_EQUAL: return TK_LESS_EQUAL_STRING;
  203.     case TK_GREATER_EQUAL: return TK_GREATER_EQUAL_STRING;
  204.     case TK_NOT_EQUAL: return TK_NOT_EQUAL_STRING;
  205.     case TK_LEFT_SHIFT: return TK_LEFT_SHIFT_STRING;
  206.     case TK_RIGHT_SHIFT: return TK_RIGHT_SHIFT_STRING;
  207.     case TK_UNSIGNED_RIGHT_SHIFT: return TK_UNSIGNED_RIGHT_SHIFT_STRING;
  208.     case TK_PLUS_EQUAL: return TK_PLUS_EQUAL_STRING;
  209.     case TK_MINUS_EQUAL: return TK_MINUS_EQUAL_STRING;
  210.     case TK_MULTIPLY_EQUAL: return TK_MULTIPLY_EQUAL_STRING;
  211.     case TK_DIVIDE_EQUAL: return TK_DIVIDE_EQUAL_STRING;
  212.     case TK_AND_EQUAL: return TK_AND_EQUAL_STRING;
  213.     case TK_OR_EQUAL: return TK_OR_EQUAL_STRING;
  214.     case TK_XOR_EQUAL: return TK_XOR_EQUAL_STRING;
  215.     case TK_REMAINDER_EQUAL: return TK_REMAINDER_EQUAL_STRING;
  216.     case TK_LEFT_SHIFT_EQUAL: return TK_LEFT_SHIFT_EQUAL_STRING;
  217.     case TK_RIGHT_SHIFT_EQUAL: return TK_RIGHT_SHIFT_EQUAL_STRING;
  218.     case TK_UNSIGNED_RIGHT_SHIFT_EQUAL: return TK_UNSIGNED_RIGHT_SHIFT_EQUAL_STRING;
  219.     case TK_OR_OR: return TK_OR_OR_STRING;
  220.     case TK_AND_AND: return TK_AND_AND_STRING;
  221.     case TK_PLUS: return TK_PLUS_STRING;
  222.     case TK_MINUS: return TK_MINUS_STRING;
  223.     case TK_NOT: return TK_NOT_STRING;
  224.     case TK_REMAINDER: return TK_REMAINDER_STRING;
  225.     case TK_XOR: return TK_XOR_STRING;
  226.     case TK_AND: return TK_AND_STRING;
  227.     case TK_MULTIPLY: return TK_MULTIPLY_STRING;
  228.     case TK_OR: return TK_OR_STRING;
  229.     case TK_TWIDDLE: return TK_TWIDDLE_STRING;
  230.     case TK_DIVIDE: return TK_DIVIDE_STRING;
  231.     case TK_GREATER: return TK_GREATER_STRING;
  232.     case TK_LESS: return TK_LESS_STRING;
  233.     case TK_LPAREN: return TK_LPAREN_STRING;
  234.     case TK_RPAREN: return TK_RPAREN_STRING;
  235.     case TK_LBRACE: return TK_LBRACE_STRING;
  236.     case TK_RBRACE: return TK_RBRACE_STRING;
  237.     case TK_LBRACKET: return TK_LBRACKET_STRING;
  238.     case TK_RBRACKET: return TK_RBRACKET_STRING;
  239.     case TK_SEMICOLON: return TK_SEMICOLON_STRING;
  240.     case TK_QUESTION: return TK_QUESTION_STRING;
  241.     case TK_COLON: return TK_COLON_STRING;
  242.     case TK_COMMA: return TK_COMMA_STRING;
  243.     case TK_DOT: return TK_DOT_STRING;
  244.     case TK_EQUAL: return TK_EQUAL_STRING;
  245.     case TK_ERROR: return TK_ERROR_STRING;
  246.     case TK_EOF: return TK_EOF_STRING;
  247.     case TK_EOL: return TK_EOL_STRING;
  248.     default:            return TK_notoken_STRING;
  249.     }
  250. }
  251.  
  252. void LexStream::Dump()
  253. {
  254.     FILE *tokfile;
  255.     char *tokfile_name = new char[FileNameLength() + 5]; // +1 for '\0' +4 for length(".tok")
  256.     strcpy(tokfile_name, FileName());
  257.     strcat(tokfile_name, StringConstant::U8S__DO_tok);
  258.  
  259.     if ((tokfile = SystemFopen(tokfile_name, "w")) == NULL)
  260.     {
  261.         Coutput << "*** Cannot open file " << tokfile_name << "\n";
  262.         return;
  263.     }
  264.  
  265.     RereadInput();
  266.  
  267.     SetUpComments();
  268.  
  269.     LexStream::TokenIndex tok = 0;
  270.     for (LexStream::CommentIndex com = FirstComment(tok); com < NumComments() && PrecedingToken(com) == tok; com++)
  271.     {
  272.         fprintf(tokfile, "*%5d ", com);
  273.         // print file name
  274.         fprintf(tokfile, "%s",FileName());
  275.         fprintf(tokfile, ", line %d.%d: ",
  276.                          FindLine(comments[com].location),
  277.                          FindColumn(comments[com].location));
  278.         for (wchar_t *s = CommentString(com); *s != U_NULL; s++)
  279.             fprintf(tokfile, "%c", *s);
  280.         fprintf(tokfile, "\n");
  281.     }
  282.  
  283.     do
  284.     {
  285.         tok = Gettoken();
  286.  
  287.         fprintf(tokfile, "%6d ", tok);
  288.         fprintf(tokfile, " %s",FileName());
  289.         fprintf(tokfile, ", %cline %d.%d: %s %s  ",
  290.                          (AfterEol(tok) ? '*' : ' '),
  291.                          Line(tok),
  292.                          Column(tok),
  293.                          token_type(Kind(tok)),
  294.                          (IsDeprecated(Previous(tok)) ? "(d)" : " "));
  295.         for (wchar_t *s = NameString(tok); *s != U_NULL; s++)
  296.             fprintf(tokfile, "%c", *s);
  297.         fprintf(tokfile, "\n");
  298.  
  299.         for (LexStream::CommentIndex com = FirstComment(tok); com < NumComments() && PrecedingToken(com) == tok; com++)
  300.         {
  301.             fprintf(tokfile, "*%5d ",com);
  302.         fprintf(tokfile, " %s",FileName());
  303.             fprintf(tokfile, ", line %d.%d: ",
  304.                              FindLine(comments[com].location),
  305.                              FindColumn(comments[com].location));
  306.             for (wchar_t *s = CommentString(com); *s != U_NULL; s++)
  307.             fprintf(tokfile, "%c", *s);
  308.             fprintf(tokfile, "\n");
  309.         }
  310.     } while (Kind(tok) != TK_EOF);
  311.  
  312.     DestroyInput();
  313.     fprintf(tokfile, "\n");
  314. #ifdef UNIQUE_NAMES
  315.     fprintf(tokfile, "\nThe unique names are:\n\n");
  316.     for (int i = 0; i < control.name_table.symbol_pool.length(); i++)
  317.     {
  318.         fprintf(tokfile, "%4d ", i);
  319.         for (wchar_t *s = control.name_table.symbol_pool[i].name(); *s != U_NULL; s++)
  320.             fprintf(tokfile, "%c", *s);
  321.         fprintf(tokfile, "\n");
  322.     }
  323. #endif
  324.  
  325.     if (tokfile)
  326.         fclose(tokfile);
  327.  
  328.     delete [] tokfile_name;
  329.  
  330.     return;
  331. }
  332.  
  333.  
  334. #ifdef    HAVE_JIKES_NAMESPACE
  335. }            // Close namespace Jikes block
  336. #endif
  337.  
  338. #endif // JIKES_DEBUG
  339.  
  340.