Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.print.DocFlavor;
- import java.io.File;
- import java.util.HashMap;
- import java.util.Scanner;
- /**
- * Created by anthony on 05.04.16.
- */
- /*
- digraph {
- rankdir = LR
- node [shape = doublecircle]; "1_ID" "2_ID" "3_KEY" "4_ID" "5_ID"
- "6_ID" "7_NUM" "8_OP" "9_WS";
- 0 [shape = circle]
- 0 -> "1_ID" [label = "d"]
- "1_ID" -> "2_ID" [label = "e"]
- "2_ID" -> "3_KEY" [label = "f"]
- 0 -> "4_ID" [label = "v"]
- "4_ID" -> "5_ID" [label = "a"]
- "5_ID" -> "3_KEY" [label = "r"]
- "5_ID" -> "3_KEY" [label = "l"]
- 0 -> "6_ID" [label = "a-z\\{d,v}"]
- "1_ID" -> "6_ID" [label = "a-z0-9\\{e}"]
- "2_ID" -> "6_ID" [label = "a-z0-9\\{f}"]
- "4_ID" -> "6_ID" [label = "a-z0-9\\{a}"]
- "5_ID" -> "6_ID" [label = "a-z0-9\\{r,l}"]
- "3_KEY" -> "6_ID" [label = "a-z0-9"]
- "6_ID" -> "6_ID" [label = "a-z0-9"]
- 0 -> "7_NUM" [label = "0-9"]
- "7_NUM" -> "7_NUM" [label = "0-9"]
- 0 -> "8_OP" [label = "["]
- 0 -> "8_OP" [label = "]"]
- 0 -> "9_WS" [label = "\\n\\r\\t' '"]
- "9_WS" -> "9_WS" [label = "\\n\\r\\t' '"]
- }
- */
- public class complab5 {
- private class Automata {
- HashMap<Character, Integer> map;
- public String program;
- private Position pos;
- private int state;
- public Automata(String program) {
- this.program = program;
- this.pos = new Position(program);
- this.state = 0;
- this.map = new HashMap<>();
- fill_map();
- }
- private int get_code(char c) {
- if (c >= '0' && c <= '9')
- return 7;
- if (']' == c || '[' == c)
- return 8;
- if (' ' == c || '\n' == c || '\r' == c || '\t' == c)
- return 9;
- switch (c) {
- case 'd':
- return 0;
- case 'e':
- return 1;
- case 'f':
- return 2;
- case 'v':
- return 3;
- case 'a':
- return 4;
- case 'r':
- return 5;
- case 'l':
- return 6;
- default:
- return 10;
- }
- }
- public int next() {
- while (-1 != pos.getCp()) {
- switch (pos.getCp()) {
- case 'd':
- int jump_code = get_code('d');
- state = table[state][jump_code];
- return state;
- }
- }
- return 0;
- }
- private String get_state_name(int state) {
- switch (state) {
- case 1:
- case 2:
- return "IDENT";
- case 3:
- return "KEYWORD";
- case 4:
- case 5:
- case 6:
- return "IDENT";
- case 7:
- return "NUMBER";
- case 8:
- return "OPERATION";
- case 9:
- return "WHITESPACE";
- default:
- return "ERROR";
- }
- }
- public void run() {
- while (-1 != pos.getCp()) {
- String word = "";
- boolean final_state = false;
- state = 0;
- Position start_pos = pos.copy();
- while (-1 != state && -1 != pos.getCp()) {
- char curr_char = program.charAt(pos.getIndex());
- int jump_code = get_code(curr_char);
- System.out.print("(" + state + ")->");
- System.out.print("[" + curr_char + "]->");
- int next_state = table[state][jump_code];
- //System.out.print("(" + next_state + ")\n");
- if (-1 == next_state) {
- final_state = true;
- System.out.print("(-1)\n");
- break;
- }
- word += curr_char;
- state = next_state;
- pos.nxt();
- }
- if (final_state) {
- String state_name = get_state_name(state);
- String start = "(" + start_pos.getLine() + ", " +
- start_pos.getPos() + ")";
- String follow = "(" + pos.getLine() + ", " +
- pos.getPos() + ")";
- System.out.println(state + " " + state_name + " " +
- start + "-" + follow + ": [" + word + "]");
- continue;
- }
- pos.nxt();
- }
- }
- private void fill_map() {
- for (char i = 'a'; i <= 'z'; i++)
- map.put(i, 6);
- for (char i = 'A'; i <= 'Z'; i++)
- map.put(i, 6);
- for (char i = '0'; i <= '9'; i++)
- map.put(i, 7);
- map.put('d', 1);
- map.put('e', 2);
- map.put('f', 3);
- map.put('v', 4);
- map.put('a', 5);
- map.put('r', 3);
- map.put('l', 3);
- map.put('[', 8);
- map.put(']', 8);
- map.put(' ', 9);
- map.put('\n', 9);
- map.put('\r', 9);
- map.put('\t', 9);
- }
- }
- //var 10
- final static int[][] table = {
- /* d e f v a r l num par ws oth*/
- /* START */{ 1, 6, 6, 4, 6, 6, 6, 7, 8, 9, 6},
- /* ID_1 */{ 6, 2, 6, 6, 6, 6, 6, 6, -1, -1, 6},
- /* ID_2 */{ 6, 6, 3, 6, 6, 6, 6, 6, -1, -1, 6},
- /* KEY_3 */{ 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, 6},
- /* ID_4 */{ 6, 6, 6, 6, 5, 6, 6, 6, -1, -1, 6},
- /* ID_5 */{ 6, 6, 6, 6, 6, 3, 3, 6, -1, -1, 6},
- /* ID_6 */{ 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, 6},
- /* NUM_7 */{-1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1},
- /* OP_8 */{-1, -1, -1, -1, -1, -1, -1, -1, 8, -1, -1},
- /* WS_9 */{-1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1}
- };
- public enum DomainTag {
- START(0),
- ID_1(1),
- ID_2(2),
- KEY_3(3),
- ID_4(4),
- ID_5(5),
- ID_6(6),
- NUM_7(7),
- OP_8(8),
- WS_9(9);
- private final int val;
- DomainTag(int val) {
- this.val = val;
- }
- public int getVal() {
- return val;
- }
- }
- /*final static int START = 0;
- final static int ID_1 = 1;
- final static int ID_2 = 2;
- final static int KEY_3 = 3;
- final static int ID_4 = 4;
- final static int ID_5 = 5;
- final static int ID_6 = 6;
- final static int NUM_7 = 7;
- final static int OP_8 = 8;
- final static int WS_9 = 9;*/
- public static void main(String []args) {
- String text = "";
- Scanner scanner;
- try {
- scanner = new Scanner(new File("in.txt"));
- } catch (java.io.FileNotFoundException e) {
- System.out.println(e.toString());
- return;
- }
- System.out.println(" 1234567890123456789");
- int i = 1;
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- System.out.println(i + " [" + line + "]");
- text += line + "\n";
- i++;
- }
- System.out.println();
- Automata auto = new complab5().new Automata(text);
- auto.run();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement