Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.39 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. public class FSM {
  7.     public static void main(String[] args) {
  8.         if(args.length == 2) {
  9.             HashMap<String, State> fsm = interpret(args[0]);
  10.             validate(fsm, args[0], args[1]);
  11.         }
  12.     }
  13.    
  14.     public static HashMap<String, State> interpret(String machine) {
  15.         try {
  16.             Scanner in = new Scanner(new File(machine));
  17.             //BufferedReader m = new BufferedReader(new InputStreamReader(new FileInputStream(machine)));
  18.             //<state>, <next_state>, <transition_symbols>
  19.             HashMap<String, State> fsm = new HashMap<String, State>();
  20.            
  21.             String transition_symbols = "";
  22.             boolean transition_sentinal = false;
  23.            
  24.             State state = new State("", "", new ArrayList<State>(), new ArrayList<Character>());
  25.             State next_state = new State("", "", new ArrayList<State>(), new ArrayList<Character>());
  26.             while(in.hasNextLine()) {
  27.                 String[] tokens = in.nextLine().split(" ");
  28.                 for(int i=0; i < tokens.length; i++)  {
  29.                     String token = tokens[i];
  30.                     //Process current state
  31.                     if(i==0) {
  32.                         String state_name = "";
  33.                         for(int j=0; j < token.length(); j++) {
  34.                             Matcher match_alpha = Pattern.compile("[a-z0-9]").matcher(token.charAt(j)+"");
  35.                             Matcher match_state_mod = Pattern.compile("[!@$]").matcher(token.charAt(j)+"");
  36.                             if(match_alpha.find()) {
  37.                                 state_name += token.charAt(j);
  38.                             } else if(match_state_mod.find()) {
  39.                                 state.addStateMod(token.charAt(j));
  40.                             }
  41.                         }
  42.                         state.setStateName(state_name);
  43.                        
  44.                         fsm.put(state_name, state);
  45.                     } else {
  46.                         // Process Transitions
  47.                         String state_name = "";
  48.                         for(int j=0; j < token.length(); j++) {
  49.                             Matcher match_alpha = Pattern.compile("[a-z0-9]").matcher(token.charAt(j)+"");
  50.                             if(token.charAt(j) == ':') {
  51.                                 next_state.setStateName(state_name);
  52.                                 for(int k=0; k < state.getTransitions().size(); k++) {
  53.                                     next_state.addTransition(state.getTransitions().get(k));
  54.                                 }
  55.                                 for(int k=0; k < state.getStateMod().size(); k++) {
  56.                                     next_state.addStateMod(state.getStateMod().get(k));
  57.                                 }
  58.                                 fsm.put(state_name, next_state);
  59.                                 //if(fsm.containsKey(state_name)) {
  60.                                     next_state.addTransition(next_state);
  61.                                 //}
  62.                                 state.addTransition(next_state);
  63.                                
  64.                                 transition_sentinal = true;
  65.                             } else if(match_alpha.find() && !transition_sentinal) {
  66.                                 state_name += token.charAt(j);
  67.                             } else if(transition_sentinal) {
  68.                                 if(token.charAt(j) == '|') {
  69.                                     String shortCut = token.charAt(j)+"";
  70.                                     j++;
  71.                                     shortCut += token.charAt(j);
  72.                                     transition_symbols += getShortCuts(shortCut);
  73.                                     transition_symbols += next_state.getTransitionSymbols();
  74.                                    
  75.                                     next_state.setTransitionSymbols(transition_symbols);
  76.                                    
  77.                                     transition_symbols = "";
  78.                                 } else {
  79.                                     transition_symbols += token.charAt(j);
  80.                                     transition_symbols += next_state.getTransitionSymbols();
  81.                                    
  82.                                     next_state.setTransitionSymbols(transition_symbols);
  83.                                    
  84.                                     transition_symbols = "";
  85.                                 }
  86.                             }
  87.                         }
  88.                         next_state = new State("", "", new ArrayList<State>(), new ArrayList<Character>());
  89.                         transition_sentinal = false;
  90.                     }
  91.                 }
  92.                 state = new State("", "", new ArrayList<State>(), new ArrayList<Character>());
  93.             }
  94.            
  95.             return fsm;
  96.            
  97.         } catch(Exception e) {
  98.             System.out.println(e);
  99.             return null;
  100.         }
  101.     }
  102.    
  103.     public static void validate(HashMap<String, State> fsm, String machine, String input) {
  104.         try {
  105.             BufferedReader m = new BufferedReader(new InputStreamReader(new FileInputStream(input)));
  106.             int r;
  107.             State s = getStateWithMod(fsm, '@');
  108.             String line = "";
  109.             while((r = m.read()) != -1 && s != null) {
  110.                 char in = (char) r;
  111.                 if(in != '\n') {
  112.                     // Go to next state depending on what in is
  113.                     line += in;
  114.                     s = getTransitionStateFrom(s, in);
  115.                     //System.out.println();
  116.                 } else {
  117.                     if(s.getStateMod().contains('$')) {
  118.                         System.out.println(machine+" Accepted: "+line);
  119.                     } else {
  120.                         System.out.println(machine+" Rejected: "+line);
  121.                     }
  122.                     s = getStateWithMod(fsm, '@');
  123.                     line = "";
  124.                 }
  125.             }
  126.         } catch(Exception e) {
  127.            
  128.         }
  129.     }
  130.    
  131.     public static State getStateWithMod(HashMap<String, State> fsm, char mod) {
  132.         Iterator<State> it = fsm.values().iterator();
  133.         while(it.hasNext()) {
  134.             State s = it.next();
  135.             if(s.getStateMod().contains(mod)) {
  136.                 return s;
  137.             }
  138.         }
  139.         return null;
  140.     }
  141.    
  142.     public static State getTransitionStateFrom(State s, char in) {
  143.         State next_state;
  144.         for(int i=0; i < s.getTransitions().size(); i++) {
  145.             next_state = s.getTransitions().get(i);
  146.             if(next_state.getTransitionSymbols().contains(in+"")) {
  147.                 return next_state;
  148.             }
  149.         }
  150.         return null;
  151.     }
  152.    
  153.     public static String getShortCuts(String s) {
  154.         if(s.equals("|d")) {
  155.             return "0123456789";
  156.         } else if(s.equals("|n")) {
  157.             return "123456789";
  158.         } else if(s.equals("|a")) {
  159.             return "abcdefghijklmnopqrstuvwxyz";
  160.         } else if(s.equals("|s")) {
  161.             return "!@#%/&*-+(){}.,";
  162.         } else {
  163.             return "";
  164.         }
  165.     }
  166.    
  167.     static class State {
  168.         private String state_name;
  169.         private String transition_symbols;
  170.         private ArrayList<Character> state_modifiers;
  171.         private ArrayList<State> transitions;
  172.        
  173.         public State(String state, String ts, ArrayList<State> t, ArrayList<Character> state_mod) {
  174.             this.state_name = state;
  175.             this.transition_symbols = ts;
  176.             this.state_modifiers = state_mod;
  177.             this.transitions = t;
  178.         }
  179.        
  180.         public String getStateName() {
  181.             return this.state_name;
  182.         }
  183.        
  184.         public ArrayList<Character> getStateMod() {
  185.             return this.state_modifiers;
  186.         }
  187.        
  188.         public ArrayList<State> getTransitions() {
  189.             return this.transitions;
  190.         }
  191.        
  192.         public void addTransition(State s) {
  193.             this.transitions.add(s);
  194.         }
  195.        
  196.         public String getTransitionSymbols() {
  197.             return this.transition_symbols;
  198.         }
  199.        
  200.         public void setTransitions(ArrayList<State> t) {
  201.             this.transitions = t;
  202.         }
  203.        
  204.         public void setTransitionSymbols(String t) {
  205.             this.transition_symbols = t;
  206.         }
  207.        
  208.         public void setStateName(String state) {
  209.             this.state_name = state;
  210.         }
  211.        
  212.         public void setStateMod(ArrayList<Character> state_mod) {
  213.             this.state_modifiers = state_mod;
  214.         }
  215.        
  216.         public void addStateMod(char ch) {
  217.             this.state_modifiers.add(ch);
  218.         }
  219.     }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement