Guest User

Untitled

a guest
Jul 18th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. template <class NumericType>
  2. bool Tokenizer<NumericType>::getChar( char &ch ) {
  3. char tmp;
  4.  
  5. // skip blanks
  6. while ( in.get( tmp ) && tmp == ' ' );
  7.  
  8. // read a char
  9. if ( in.good( ) && tmp != '\n'&& tmp != '\0' ) {
  10. ch = tmp;
  11. return true; // if it is not a delimiter
  12. }
  13. else
  14. return false; // if it's a delimitter
  15. }
  16.  
  17. template <class NumericType>
  18. Token<NumericType> Tokenizer<NumericType>::getToken( ) {
  19.  
  20. char ch;
  21. NumericType theValue;
  22.  
  23. if ( getChar( ch ) == true ) {
  24. switch( ch ) {
  25. case '(': return (prevToken = OPAREN);
  26. case ')': return (prevToken = CPAREN);
  27.  
  28. case '!':
  29. if ( getChar( ch ) == true && ch == '=' )
  30. return (prevToken = NOTEQUAL);
  31. in.putback( ch );
  32.  
  33. cerr << "no negation allowed" << endl;
  34. return (prevToken = EOL);
  35.  
  36. case '*': return (prevToken = MULT);
  37.  
  38. case '/': return (prevToken = DIV);
  39.  
  40. case '%': return (prevToken = MODULUS);
  41.  
  42. case '+': return (prevToken = PLUS);
  43.  
  44. case '-': return (prevToken = MINUS);
  45.  
  46. case 'a':
  47. prevToken = VAR_A;
  48. return Token( VAR_A, 0 );
  49. case 'b':
  50. prevToken = VAR_B;
  51. return Token( VAR_B, 0 );
  52. case 'c':
  53. prevToken = VAR_C;
  54. return Token( VAR_C, 0 );
  55.  
  56.  
  57. case '<':
  58. if ( getChar( ch ) == true ) {
  59. switch( ch ) {
  60. case '<': return (prevToken = SHIFT_L);
  61. case '=': return (prevToken = LE);
  62. default:
  63. in.putback( ch );
  64. return (prevToken = LT);
  65. }
  66. }
  67. in.putback( ch );
  68. return (prevToken = LT);
  69.  
  70. case '>':
  71. if ( getChar( ch ) == true ) {
  72. switch( ch ) {
  73. case '>': return (prevToken = SHIFT_R);
  74. case '=': return (prevToken = GE);
  75. default:
  76. in.putback( ch );
  77. return (prevToken = GT);
  78. }
  79. }
  80. in.putback( ch );
  81. return (prevToken = GT);
  82.  
  83. case '&':
  84. if ( getChar( ch ) == true && ch == '&' )
  85. return (prevToken = LOG_AND);
  86. in.putback( ch );
  87. return (prevToken = BIT_AND);
  88.  
  89. case '^': return (prevToken = BIT_EOR);
  90.  
  91. case '|':
  92. if ( getChar( ch ) == true && ch == '|' )
  93. return (prevToken = LOG_OR);
  94. in.putback( ch );
  95. return (prevToken = BIT_IOR);
  96.  
  97. case '=':
  98. if ( getChar( ch ) == true && ch == '=' )
  99. return (prevToken = EQUAL);
  100. in.putback( ch );
  101.  
  102. cerr << "no assignment allowed" << endl;
  103. return (prevToken = EOL);
  104.  
  105. default:
  106. in.putback( ch );
  107. if ( !( in >> theValue ) ) {
  108. cerr << "Parse error" << endl;
  109. return (prevToken = EOL);
  110. }
  111. prevToken = VALUE;
  112. return Token<NumericType>( VALUE, theValue );
  113. }
  114. }
  115.  
  116. return (prevToken = EOL);
  117. }
Add Comment
Please, Sign In to add comment