Advertisement
canezzy

Untitled

Jun 3rd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.92 KB | None | 0 0
  1. #include <sstream>
  2.  
  3. #include "FiniteStateMachine.h"
  4.  
  5. using namespace std;
  6.  
  7. const TokenType FiniteStateMachine::stateToTokenTable[NUM_STATES] = {
  8.     /*state 00*/    T_NO_TYPE,
  9.     /*state 01*/    T_NO_TYPE,
  10.     /*state 02*/    T_NUM,
  11.     /*state 03*/    T_COMMA,
  12.     /*state 04*/    T_L_PARENT,
  13.     /*state 05*/    T_R_PARENT,
  14.     /*state 06*/    T_COL,
  15.     /*state 07*/    T_SEMI_COL,
  16.     /*state 08*/    T_WHITE_SPACE,
  17.     /*state 09*/    T_NO_TYPE,
  18.     /*state 10*/    T_ID,
  19.     /*state 11*/    T_ID,
  20.     /*state 12*/    T_ID,
  21.     /*state 13*/    T_FUNC,
  22.     /*state 14*/    T_ID,
  23.     /*state 15*/    T_ID,
  24.     /*state 16*/    T_MEM,
  25.     /*state 17*/    T_ID,
  26.     /*state 18*/    T_ID,
  27.     /*state 19*/    T_REG,
  28.     /*state 20*/    T_ID,
  29.     /*state 21*/    T_M_ID,
  30.     /*state 22*/    T_R_ID,
  31.     /*state 23*/    T_ID,
  32.     /*state 24*/    T_ID,
  33.     /*state 25*/    T_ADD,
  34.     /*state 26*/    T_ADDI,
  35.     /*state 27*/    T_B,
  36.     /*state 28*/    T_ID,
  37.     /*state 29*/    T_ID,
  38.     /*state 30*/    T_BLTZ,
  39.     /*state 31*/    T_ID,
  40.     /*state 32*/    T_LA,
  41.     /*state 33*/    T_LW,
  42.     /*state 34*/    T_ID,
  43.     /*state 35*/    T_ID,
  44.     /*state 36*/    T_NOP,
  45.     /*state 37*/    T_ID,
  46.     /*state 38*/    T_ID,
  47.     /*state 39*/    T_SUB,
  48.     /*state 40*/    T_SW,
  49.     /*state 41*/    T_ERROR,
  50.     /*state 42*/    T_LI,
  51.     /*state 43*/    T_NO_TYPE,
  52.     /*state 44*/    T_COMMENT,
  53.     /*state 45*/    T_SUBU,
  54.     /*state 46*/    T_ADDU
  55. };
  56.  
  57. const char FiniteStateMachine::supportedCharacters[NUM_OF_CHARACTERS] =
  58. {
  59.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  60.     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
  61.     'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  62.     'u', 'v', 'w', 'x', 'y', 'z',
  63.     '_', ',', '(', ')', ':', ';', ' ', '\t', '\n', '\r', '/'
  64. };
  65.  
  66. /*
  67.     S - space,
  68.     T - tab,
  69.     E - enter,
  70.     C - clear line
  71. */
  72. const int FiniteStateMachine::stateMatrix[NUM_STATES][NUM_OF_CHARACTERS] =
  73. {
  74.                 //    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  _  ,  (  )  :  ;  S  T  E  C  /
  75.     /* state 00 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // IDLE
  76.  
  77.     /* state 01 */  { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,23,27,20,20,20,20,20,20,20,20,20,31,21,34,20,20,20,22,37,20,20,20,20,20,20,20, 9, 3, 4, 5, 6, 7, 8, 8, 8, 8,43},     // START_STATE
  78.    
  79.     /* state 02 */  { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_NUM
  80.    
  81.     /* state 03 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_COMMA
  82.     /* state 04 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_L_PARENT
  83.     /* state 05 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_R_PARENT
  84.     /* state 06 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_COL
  85.     /* state 07 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_SEMI_COL
  86.     /* state 08 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0},     // T_WHITE_SPACE
  87.    
  88.     /* state 09 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,10,41,41,41,41,41,41,14,41,41,41,41,17,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // _
  89.    
  90.     /* state 10 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,11,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // F - T_ID
  91.     /* state 11 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,12,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // U - T_ID
  92.     /* state 12 */  {41,41,41,41,41,41,41,41,41,41,41,41,13,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // N - T_ID
  93.     /* state 13 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41, 0, 0, 0, 0,41},     // T_FUNC
  94.  
  95.     /* state 14 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,15,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // M - T_ID
  96.     /* state 15 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // E - T_ID
  97.     /* state 16 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41, 0, 0, 0, 0,41},     // T_MEM
  98.  
  99.     /* state 17 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,18,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // R - T_ID
  100.     /* state 18 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,19,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},     // E - T_ID
  101.     /* state 19 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41, 0, 0, 0, 0,41},     // T_REG
  102.  
  103.     /* state 20 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_ID
  104.     /* state 21 */  {21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_M_ID
  105.     /* state 22 */  {22,22,22,22,22,22,22,22,22,22,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_R_ID
  106.  
  107.     /* state 23 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,24,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // A - T_ID
  108.     /* state 24 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,25,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // D - T_ID
  109.     /* state 25 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,26,20,20,20,20,20,20,20,20,20,20,20,46,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_ADD
  110.     /* state 26 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_ADDI
  111.  
  112.     /* state 27 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,28,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // B or T_B
  113.     /* state 28 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,29,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // L - T_ID
  114.     /* state 29 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,30,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T - T_ID
  115.     /* state 30 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_BLTZ
  116.  
  117.     /* state 31 */  {20,20,20,20,20,20,20,20,20,20,32,20,20,20,20,20,20,20,42,20,20,20,20,20,20,20,20,20,20,20,20,20,33,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // L - T_ID
  118.     /* state 32 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_LA
  119.     /* state 33 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_LW
  120.  
  121.     /* state 34 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,35,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // N - T_ID
  122.     /* state 35 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,36,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // O - T_ID
  123.     /* state 36 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_NOP
  124.  
  125.     /* state 37 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,38,20,40,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // S - T_ID
  126.     /* state 38 */  {20,20,20,20,20,20,20,20,20,20,20,39,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // U - T_ID
  127.     /* state 39 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,45,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_SUB
  128.     /* state 40 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_SW
  129.  
  130.     /* state 41 */  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_ERROR
  131.  
  132.     /* state 42 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_LI
  133.  
  134.                 //    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  _  ,  (  )  :  ;  S  T  E  C  /
  135.     /* state 43 */  {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,44},     // /
  136.     /* state 44 */  {44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44, 0, 0,44},     // T_COMMENT
  137.  
  138.     /* state 45 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_SUBU
  139.     /* state 46 */  {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     // T_ADDU
  140.  
  141. };
  142.  
  143.  
  144. TokenType FiniteStateMachine::getTokenType(int stateNumber)
  145. {
  146.     return stateToTokenTable[stateNumber];
  147. }
  148.  
  149.  
  150. void FiniteStateMachine::initStateMachine()
  151. {
  152.     for (int i = 0; i < NUM_STATES; i++)
  153.     {
  154.         map<char, int> stateTransitions;
  155.         for (int j = 0; j < NUM_OF_CHARACTERS; j++)
  156.         {
  157.             stateTransitions[supportedCharacters[j]] = stateMatrix[i][j];
  158.         }
  159.         stateMachine[i] = stateTransitions;
  160.     }
  161. }
  162.  
  163.  
  164. int FiniteStateMachine::getNextState(int currentState, char transitionLetter)
  165. {
  166.     STATE_MACHINE::iterator it = stateMachine.find(currentState);
  167.    
  168.     if (it == stateMachine.end())
  169.     {
  170.         string strCurrentState;
  171.         stringstream ss;
  172.         ss << currentState;
  173.         ss >> strCurrentState;
  174.         string errMessage = "\nEXCEPTION: currentState = " + strCurrentState + " is not a valid state!";
  175.         throw runtime_error(errMessage.c_str());
  176.     }
  177.  
  178.     map<char, int>::iterator cit = it->second.find(transitionLetter);
  179.  
  180.     if (cit == it->second.end())
  181.     {
  182.         return INVALID_STATE;
  183.     }
  184.     else
  185.     {
  186.         return cit->second;
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement