Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
fja
eval
Commits
9ed4371e
Commit
9ed4371e
authored
Jul 15, 2020
by
Kateřina Sloupová
Browse files
few comments, tweaks, cleanup
parent
9dcd6d8e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
9ed4371e
...
...
@@ -9,7 +9,7 @@ all : test
typecheck
:
$(PY:%=%.mypy)
unit
:
pytest
PYTHONPATH
=
$$
PWD
pytest
test
:
typecheck unit
...
...
demo.py
View file @
9ed4371e
...
...
@@ -122,22 +122,6 @@ def grammar_test(str):
#gra.cfg_to_reggrammar()
print
()
def
web_eq
(
str1
,
type1
,
str2
,
type2
):
try
:
web
=
WebChecker
(
str1
,
type1
)
web
.
compare
(
str2
,
type2
)
if
web
.
ok
:
print
(
"ok"
)
elif
web
.
eq
:
if
web
.
eq
.
left_counterexample
is
not
None
:
print
(
web
.
eq
.
left_counterexample
)
if
web
.
eq
.
right_counterexample
is
not
None
:
print
(
web
.
eq
.
right_counterexample
)
print
(
web
.
eq
.
inf
)
except
RecognitionException
as
re
:
print
(
re
)
def
web_conv
(
str
,
type
,
task
):
try
:
web
=
WebChecker
(
str
,
task
)
...
...
@@ -362,14 +346,13 @@ def main():
grammar_test
(
"S'->a|aA''|\e;A''->a|bS'|<ab_0>''"
)
grammar_test
(
"S->a;
\n
S->aA;
\n
S->\e;
\n
A->a;
\n
A->bS;
\n
"
)
words
=
dfa_eq
(
"init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3}"
,
words
=
dfa_eq
(
"init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3}
$comment#
"
,
"init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}"
)
print
(
words
.
right_counterexample
,
words
.
left_counterexample
,
words
.
inf
)
print
()
print
(
"Info pro web"
)
web_eq
(
"init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3}"
,
'DFA'
,
"init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}"
,
'DFA'
)
#web_eq("init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3}", 'DFA',"init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}", 'DFA')
web_conv
(
"S->a|aA;A->a|b"
,
"GRA"
,
"DFA"
)
...
...
lib/dfa.py
View file @
9ed4371e
...
...
@@ -24,8 +24,9 @@ class IsEmptyResult:
class
IsEquivalentResult
:
def
__init__
(
self
,
left_counterexample
:
Optional
[
str
]
=
None
,
right_counterexample
:
Optional
[
str
]
=
None
,
inf
:
Optional
[
bool
]
=
None
):
def
__init__
(
self
,
left_counterexample
:
Optional
[
str
]
=
None
,
right_counterexample
:
Optional
[
str
]
=
None
,
inf
:
Optional
[
bool
]
=
None
):
self
.
left_counterexample
=
left_counterexample
self
.
right_counterexample
=
right_counterexample
self
.
inf
=
inf
...
...
@@ -51,7 +52,7 @@ class DFA:
self
.
final
=
final
self
.
check
()
def
check
(
self
):
def
check
(
self
):
# this control exists mainly for development reasons
assert
len
(
self
.
states
)
>
0
,
"empty automaton"
for
(
state
,
character
)
in
self
.
transition
:
...
...
@@ -215,46 +216,47 @@ class DFA:
def
sorted_characters
(
self
)
->
List
[
Character
]:
return
sorted
(
self
.
characters
,
key
=
lambda
x
:
x
.
name
)
def
minimize
(
self
)
->
DFA
:
def
minimize
(
self
)
->
DFA
:
# 26-30, section 2.1.5
dfa
=
self
.
eliminate_unreachable
().
total
()
characters
=
self
.
sorted_characters
()
# bc I want to iterate always in same order
characters
=
self
.
sorted_characters
()
# bc I want to iterate always in
the
same order
previous
:
Dict
[
State
,
int
]
=
dict
()
actual
:
Dict
[
State
,
int
]
=
dict
()
for
state
in
dfa
.
states
:
for
state
in
dfa
.
states
:
# first classification: final or non-final
if
state
in
dfa
.
final
:
actual
[
state
]
=
1
else
:
actual
[
state
]
=
0
# how many classes are there now:
classes_prev
=
0
classes_new
=
1
if
len
(
self
.
final
)
>
0
else
0
if
len
(
self
.
states
.
difference
(
self
.
final
))
>
0
:
classes_new
=
1
if
len
(
self
.
final
)
>
0
else
0
# there exist some final states
if
len
(
self
.
states
.
difference
(
self
.
final
))
>
0
:
# and there exist some non-final states
classes_new
+=
1
while
classes_prev
!=
classes_new
:
while
classes_prev
!=
classes_new
:
# did number of classes change?
previous
=
deepcopy
(
actual
)
patterns
:
Dict
[
Tuple
[
int
,
...],
Set
[
State
]]
=
dict
()
actual
=
dict
()
for
state
in
dfa
.
states
:
pattern
=
[
previous
[
state
]]
for
character
in
characters
:
pattern
.
append
(
previous
[
dfa
.
transition
[
state
,
character
]])
for
state
in
dfa
.
states
:
# each state gets new pattern consisting of
pattern
=
[
previous
[
state
]]
# previous class
for
character
in
characters
:
# and for each transition
pattern
.
append
(
previous
[
dfa
.
transition
[
state
,
character
]])
# previous class of dest_state
patterns
.
setdefault
(
tuple
(
pattern
),
set
()).
add
(
state
)
classes_prev
=
classes_new
classes_new
=
0
for
states
in
patterns
.
values
():
for
state
in
states
:
actual
[
state
]
=
classes_new
for
states
in
patterns
.
values
():
# according to new patterns
for
state
in
states
:
# each state
actual
[
state
]
=
classes_new
# gets to new class
classes_new
+=
1
new_transition
:
DFA
.
Transition
=
{}
dfa
.
states
=
set
()
dfa
.
final
=
set
()
for
state
in
actual
:
for
state
in
actual
:
# according to last classification of states
new_state
=
State
(
"new_"
+
str
(
actual
[
state
]))
dfa
.
states
.
add
(
new_state
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment