CS 150 / LAB 1 / Item 1

Oct 25th, 2021
504
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. from enum import Enum
2.
3. class NumberBase(Enum):
4.     DECIMAL = 'DECIMAL'
5.     HEX = 'HEX'
6.     OCTAL = 'OCTAL'
7.     BINARY = 'BINARY'
8.
9. def parse_number_base(str):
10.     conditions = [
11.     {'curr_state': 'START', 'input': ['0'], 'next_state': 'ZERO', 'accept': 0},
12.     {'curr_state': 'START', 'input': [chr(i) for i in range(49,56)],'next_state': 'DEC_OCT_HEX', 'accept': 0},
13.     {'curr_state': 'START', 'input': ['8','9'], 'next_state': 'DEC_HEX', 'accept': 0},
14.     {'curr_state': 'ZERO', 'input': ['b','B'], 'next_state': 'BIN_START', 'accept': 1},
15.     {'curr_state': 'ZERO', 'input': [chr(i) for i in range(48,56)], 'next_state': 'OCT', 'accept': 1},
16.     {'curr_state': 'ZERO', 'input': ['x','X'], 'next_state': 'HEX_START', 'accept': 1},
17.     {'curr_state': 'BIN_START','input': ['0','1'], 'next_state': 'BIN', 'accept': 0},
18.     {'curr_state': 'HEX_START', 'input': [chr(i) for i in range(48,58)] + [chr(j) for j in range(97,103)] + [chr(k) for k in range(65,71)], 'next_state': 'HEX', 'accept': 0},
19.     {'curr_state': 'BIN', 'input': ['0','1'], 'next_state': 'BIN', 'accept': 1},
20.     {'curr_state': 'OCT', 'input': [chr(i) for i in range(48,56)], 'next_state': 'OCT', 'accept': 1},
21.     {'curr_state': 'DEC_OCT_HEX', 'input': [chr(i) for i in range(48,56)], 'next_state': 'DEC_OCT_HEX', 'accept': 1},
22.     {'curr_state': 'DEC_OCT_HEX', 'input': ['8','9'], 'next_state': 'DEC_HEX', 'accept': 1},
23.     {'curr_state': 'DEC_OCT_HEX', 'input': [chr(j) for j in range(97,103)] + [chr(k) for k in range(65,71)], 'next_state': 'HEX', 'accept': 1},
24.     {'curr_state': 'DEC_HEX', 'input': [chr(i) for i in range(48,58)], 'next_state': 'DEC_HEX', 'accept': 1},
25.     {'curr_state': 'DEC_HEX', 'input': [chr(j) for j in range(97,103)] + [chr(k) for k in range(65,71)], 'next_state': 'HEX', 'accept': 1},
26.     {'curr_state': 'HEX', 'input': [chr(i) for i in range(48,58)] + [chr(j) for j in range(97,103)] + [chr(k) for k in range(65,71)], 'next_state': 'HEX', 'accept': 1}]
27.
28.     res = [
29.     {'final_state': 'ZERO', 'result': NumberBase.DECIMAL},
30.     {'final_state': 'DEC_OCT_HEX', 'result': NumberBase.DECIMAL},
31.     {'final_state': 'DEC_HEX', 'result': NumberBase.DECIMAL},
32.     {'final_state': 'BIN', 'result': NumberBase.BINARY},
33.     {'final_state': 'OCT', 'result': NumberBase.OCTAL},
34.     {'final_state': 'HEX', 'result': NumberBase.HEX}]
35.
36.     current_state = 'START'
37.     current_char = str[0]
38.     while(1):
39.         print("str:",str)
40.         print("char:",current_char)
41.         if len(str) == 0:
42.             for condition in conditions:
43.                 if condition.get('current_state') == current_state and condition.get('accept') == 1:
44.                     for item in res:
45.                         if item.get('final_state') == current_state:
46.                             return item.get('result')
47.                 else:
48.                     return None
49.         else:
50.             current_char = str[0]
51.             print("current_char",current_char)
52.             for condition in conditions:
53.                 if (condition.get('curr_state') == current_state) and (current_char in condition.get('input')):
54.                     current_state = condition.get('next_state')
55.                 str = str[1:]
56.
57.
58.
59. print(parse_number_base("12345"))
60.
61.
62.
RAW Paste Data