Skip to content

Commit 4423ccf

Browse files
committed
simplify constructors of enfa, pda and cfg, use hashable in fcfg constructor
1 parent 1d6649a commit 4423ccf

File tree

3 files changed

+24
-48
lines changed

3 files changed

+24
-48
lines changed

pyformlang/cfg/cfg.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,12 @@ def __init__(self,
4747
start_symbol: Hashable = None,
4848
productions: Iterable[Production] = None) -> None:
4949
super().__init__()
50-
if variables is not None:
51-
variables = {to_variable(x) for x in variables}
52-
self._variables = variables or set()
53-
if terminals is not None:
54-
terminals = {to_terminal(x) for x in terminals}
55-
self._terminals = terminals or set()
50+
self._variables = {to_variable(x) for x in variables or set()}
51+
self._terminals = {to_terminal(x) for x in terminals or set()}
52+
self._start_symbol = None
5653
if start_symbol is not None:
57-
start_symbol = to_variable(start_symbol)
58-
self._variables.add(start_symbol)
59-
self._start_symbol = start_symbol
54+
self._start_symbol = to_variable(start_symbol)
55+
self._variables.add(self._start_symbol)
6056
self._productions = set()
6157
for production in productions or set():
6258
self.add_production(production)

pyformlang/finite_automaton/epsilon_nfa.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,14 @@ def __init__(
6565
start_states: AbstractSet[Hashable] = None,
6666
final_states: AbstractSet[Hashable] = None) -> None:
6767
super().__init__()
68-
if states is not None:
69-
states = {to_state(x) for x in states}
70-
self._states = states or set()
71-
if input_symbols is not None:
72-
input_symbols = {to_symbol(x) for x in input_symbols}
73-
self._input_symbols = input_symbols or set()
68+
self._states = {to_state(x) for x in states or set()}
69+
self._input_symbols = {to_symbol(x) for x in input_symbols or set()}
7470
self._transition_function = transition_function \
7571
or NondeterministicTransitionFunction()
76-
if start_states is not None:
77-
start_states = {to_state(x) for x in start_states}
78-
self._start_states = start_states or set()
79-
if final_states is not None:
80-
final_states = {to_state(x) for x in final_states}
81-
self._final_states = final_states or set()
82-
for state in self._final_states:
83-
self._states.add(state)
84-
for state in self._start_states:
85-
self._states.add(state)
72+
self._start_states = {to_state(x) for x in start_states or set()}
73+
self._states.update(self._start_states)
74+
self._final_states = {to_state(x) for x in final_states or set()}
75+
self._states.update(self._final_states)
8676

8777
def _get_next_states_iterable(
8878
self,

pyformlang/pda/pda.py

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -69,33 +69,23 @@ def __init__(self,
6969
transition_function: TransitionFunction = None,
7070
start_state: Hashable = None,
7171
start_stack_symbol: Hashable = None,
72-
final_states: AbstractSet[Hashable] = None):
72+
final_states: AbstractSet[Hashable] = None) -> None:
7373
# pylint: disable=too-many-arguments
74-
if states is not None:
75-
states = {to_state(x) for x in states}
76-
if input_symbols is not None:
77-
input_symbols = {to_symbol(x) for x in input_symbols}
78-
if stack_alphabet is not None:
79-
stack_alphabet = {to_stack_symbol(x) for x in stack_alphabet}
80-
if start_state is not None:
81-
start_state = to_state(start_state)
82-
if start_stack_symbol is not None:
83-
start_stack_symbol = to_stack_symbol(start_stack_symbol)
84-
if final_states is not None:
85-
final_states = {to_state(x) for x in final_states}
86-
self._states: Set[State] = states or set()
87-
self._input_symbols: Set[PDASymbol] = input_symbols or set()
88-
self._stack_alphabet: Set[StackSymbol] = stack_alphabet or set()
74+
self._states = {to_state(x) for x in states or set()}
75+
self._input_symbols = {to_symbol(x) for x in input_symbols or set()}
76+
self._stack_alphabet = {to_stack_symbol(x)
77+
for x in stack_alphabet or set()}
8978
self._transition_function = transition_function or TransitionFunction()
90-
self._start_state: Optional[State] = start_state
79+
self._start_state = None
9180
if start_state is not None:
92-
self._states.add(start_state)
93-
self._start_stack_symbol: Optional[StackSymbol] = start_stack_symbol
81+
self._start_state = to_state(start_state)
82+
self._states.add(self._start_state)
83+
self._start_stack_symbol = None
9484
if start_stack_symbol is not None:
95-
self._stack_alphabet.add(start_stack_symbol)
96-
self._final_states: Set[State] = final_states or set()
97-
for state in self._final_states:
98-
self._states.add(state)
85+
self._start_stack_symbol = to_stack_symbol(start_stack_symbol)
86+
self._stack_alphabet.add(self._start_stack_symbol)
87+
self._final_states = {to_state(x) for x in final_states or set()}
88+
self._states.update(self._final_states)
9989

10090
@property
10191
def states(self) -> Set[State]:

0 commit comments

Comments
 (0)