NyanCoder

MyScanner.cs

Nov 19th, 2019 (edited)
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.77 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Scanner
  4. {
  5.     class MyScanner
  6.     {
  7.         static public String Scan(String input)
  8.         {
  9.             MyScanner scanner = new MyScanner();
  10.  
  11.             foreach (var character in input)
  12.                 scanner.step(character);
  13.             scanner.step((char)0);
  14.  
  15.             return scanner.result();
  16.         }
  17.  
  18.         private enum state
  19.         {
  20.             space  = 0,
  21.  
  22.             num    = 1,
  23.             var    = 2,
  24.             add    = 3,
  25.             sub    = 4,
  26.             div    = 5,
  27.             mul    = 6,
  28.             bro    = 7, // BROOOOOO!!!!!!
  29.             brc    = 8,
  30.  
  31.             end    = 999
  32.         }
  33.  
  34.         private state currentState;
  35.         private String res;
  36.         private String buffer;
  37.  
  38.         private MyScanner()
  39.         {
  40.             currentState = state.space;
  41.             res = "";
  42.             buffer = "";
  43.         }
  44.  
  45.         private string result()
  46.         {
  47.             return res;
  48.         }
  49.  
  50.         private void step(char character)
  51.         {
  52.             state nextState = calculateState(character);
  53.  
  54.             // no more {var|num} condition
  55.             if (((currentState == state.var) && (nextState != state.var)) || ((currentState == state.num) && (nextState != state.num)))
  56.                 res += String.Format("{0} - ({1})\n", (int)currentState, buffer);
  57.  
  58.             switch (nextState)
  59.             {
  60.                 case state.add:
  61.                 case state.sub:
  62.                 case state.div:
  63.                 case state.mul:
  64.                 case state.bro:
  65.                 case state.brc:
  66.                     res += String.Format("{0}\n", (int)nextState);
  67.                     break;
  68.  
  69.                 case state.num:
  70.                 case state.var:
  71.                     if (currentState != nextState)
  72.                         buffer = character.ToString();
  73.                     else
  74.                         buffer += character;
  75.                     break;
  76.             }
  77.  
  78.             currentState = nextState;
  79.         }
  80.  
  81.         private state calculateState(char character)
  82.         {
  83.             if (Char.IsLetter(character))
  84.                 return state.var;
  85.             if (Char.IsDigit(character))
  86.                 return (currentState == state.var) ? state.var : state.num;
  87.             switch (character)
  88.             {
  89.                 case '+': return state.add;
  90.                 case '-': return state.sub;
  91.                 case '*': return state.mul;
  92.                 case '/': return state.div;
  93.                 case '(': return state.bro;
  94.                 case ')': return state.brc;
  95.                 case ' ': case '\t': case '\n': return state.space;
  96.                 case (char)0: return state.end;
  97.             }
  98.             return state.end;
  99.         }
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment