readme update
This commit is contained in:
parent
1a7d79723f
commit
bb2ce58c31
32
readme.md
32
readme.md
@ -1,4 +1,4 @@
|
|||||||
#Uzycie
|
# Uzycie
|
||||||
|
|
||||||
`python program.py -f plik.txt`, gdzie każda linia to nowa formuła
|
`python program.py -f plik.txt`, gdzie każda linia to nowa formuła
|
||||||
|
|
||||||
@ -8,17 +8,17 @@
|
|||||||
|
|
||||||
+Opcjonalny przełącznik `-g`, który przełącza tryb sprawdzania na Regexp
|
+Opcjonalny przełącznik `-g`, który przełącza tryb sprawdzania na Regexp
|
||||||
|
|
||||||
#Założenia:
|
# Założenia:
|
||||||
|
|
||||||
1. Algorytm sprawdzający poprawność nie musi parsować wyrażenia
|
1. Algorytm sprawdzający poprawność nie musi parsować wyrażenia
|
||||||
2. Można było po prostu napisać parser - gdy formuła nie będzie poprawna to gdzieś dostaniemy błąd - ciekawiej jest jednak wymyślić coś nowego samemu.
|
2. Można było po prostu napisać parser - gdy formuła nie będzie poprawna to gdzieś dostaniemy błąd - ciekawiej jest jednak wymyślić coś nowego samemu.
|
||||||
|
|
||||||
|
|
||||||
#Co to jest poprawna formuła?
|
# Co to jest poprawna formuła?
|
||||||
|
|
||||||
Dowolne wyrażenie KRZ, gdzie zmienną jest dowolny znak od `a` do `z` A znakiem specjalnym jest znak zawierający się w zbiorze `{ (, ), &, >, =, | }`. Nawiasy muszą być poprawnie zamknięte
|
Dowolne wyrażenie KRZ, gdzie zmienną jest dowolny znak od `a` do `z` A znakiem specjalnym jest znak zawierający się w zbiorze `{ (, ), &, >, =, | }`. Nawiasy muszą być poprawnie zamknięte
|
||||||
|
|
||||||
#Algorytm
|
# Algorytm
|
||||||
|
|
||||||
W osobnej tablicy o długości równej ilości znaków formuły zapisujemy `głębkość` (dalej nazywaną `depth`) danego znaku. Nim bardziej zagnieżdżone jest podwyrażenie, tym większa wartość `głębkokości`. Tak dla formuły `a>b`, tablica `depth` przyjmie wartości `0,0,0`, ale dla `a|(a&b)>(c|q)` będzie to już `0,0,1,1,1,1,1,0,1,1,1,1,1`. Widać zatem, że można tak znaleźć zagnieżdżone podformuły.
|
W osobnej tablicy o długości równej ilości znaków formuły zapisujemy `głębkość` (dalej nazywaną `depth`) danego znaku. Nim bardziej zagnieżdżone jest podwyrażenie, tym większa wartość `głębkokości`. Tak dla formuły `a>b`, tablica `depth` przyjmie wartości `0,0,0`, ale dla `a|(a&b)>(c|q)` będzie to już `0,0,1,1,1,1,1,0,1,1,1,1,1`. Widać zatem, że można tak znaleźć zagnieżdżone podformuły.
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ Istnieje skończona ilość reguł, które określają formułę jako niepoprawn
|
|||||||
6. Operator dwuargumentowy bez wyrażeń po obu stronach
|
6. Operator dwuargumentowy bez wyrażeń po obu stronach
|
||||||
|
|
||||||
|
|
||||||
#Przełącznik -g
|
# Przełącznik -g
|
||||||
|
|
||||||
Zadaniem było tylko sprawdzenie, czy formuła jest poprawnie zapisana. Jak zostało wcześniej wspomniane istnieje skończona ilość reguł które mówią że formuła jest **niepoprawna**.
|
Zadaniem było tylko sprawdzenie, czy formuła jest poprawnie zapisana. Jak zostało wcześniej wspomniane istnieje skończona ilość reguł które mówią że formuła jest **niepoprawna**.
|
||||||
|
|
||||||
@ -49,3 +49,25 @@ Dla każdej z powyższych reguł można sformułować odpowiednie wyrażenie, kt
|
|||||||
Taki sposób jest o wiele wolniejszy i mniej ciekawy niż poprzedni, ale też działa. Do tego, wyrażenia KRZ nie są regularne, więc używanie narzędzia zupełnie do tego nieprzeznaczonego wydało się nam ciekawe do zaprezentowania.
|
Taki sposób jest o wiele wolniejszy i mniej ciekawy niż poprzedni, ale też działa. Do tego, wyrażenia KRZ nie są regularne, więc używanie narzędzia zupełnie do tego nieprzeznaczonego wydało się nam ciekawe do zaprezentowania.
|
||||||
|
|
||||||
|
|
||||||
|
# Opis struktury programu
|
||||||
|
|
||||||
|
`class Formula` reprezentuje formułę. Konstruktor przyjmuje `string` formula i obiekt interpretera. Interpreter to dowolny obiekt z metodą `isValid(f:Formula)->bool`.
|
||||||
|
|
||||||
|
## AbstractInterpreter
|
||||||
|
|
||||||
|
Klasa pomocnicza, klasy abstrakcyjne nie istnieją w Pythonie, ale warto zrobić jakąś bazę.
|
||||||
|
|
||||||
|
## SimpleInterpreter
|
||||||
|
|
||||||
|
Klasa definiująca interpreter, który sprawdza, czy formuła bez zagnieżdzeń jest poprawnie zapisana. Opiera się na sztywnym zbiorze reguł
|
||||||
|
|
||||||
|
## ProperInterpreter
|
||||||
|
|
||||||
|
Klasa definiująca interpreter sprawdzający czy złożona formuła jest poprawna. Rozbija rekurencyjnie na mniejsze formuły aż do momentu, kiedy można je sprawdzić przez `SimpleInterpreter`
|
||||||
|
|
||||||
|
## RegexInterpreter
|
||||||
|
|
||||||
|
Klasa definiująca interpreter, który swoje działanie opiera na wyrażeniach regularnych i programie `grep`. Działa tylko, gdy ten program jest zainstalowany (czyli głównie na linuksie).
|
||||||
|
|
||||||
|
Szuka niepoprawnych ciągów i sprawdza czy nawiasy są prawidłowo pozamykane.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user