====== Cvičení 9, Fronta, Stavový automat ====== ===== náplň cvičení ===== ==== Quick test 1 ==== ==== Úloha 1 Fronta ==== * Přeměňte řešení úlohy 3 Flood fill z cvičení 8 na frontu. * Postupnou animací zjistěte jak se změnilo vyplňování prostoru * Zjistěte, zda potřebuje více paměti zásobník, nebo fronta ==== Úloha 2 Komentáře - rozšíření ==== * Upravte program na odstraňování komentářů z přednášky tak: * aby program bral v úvahu řetězce začínající a končící znakem ' * aby správně interpretoval znaky \' a \" * aby pokud řádka končí znakem \ dovedl řetězec prodloužit přes více řádek * Program otestujte na následujících datech a='b\'c#d' #e i="j\"k'l#m" #n * Program z přednášky: def preskoc_komentare(line): # vytiskne obsah souboru 'f' s vynechanymi komentari stav=0 # počáteční stav automatu for c in line: # přečti jeden znak if stav==0: # počáteční stav if c=="#": # začátek komentáře stav=1 continue elif c=='\"': stav=2 # začátek řetězce elif stav==1: # 1="komentar" continue elif stav==2: if c=='\"': stav=0 print(c,end="") # vytiskni znak i=input() preskoc_komentare(i) # nacti radku a preskakuj ==== Úloha 3 Kontrola reálného čísla ==== * Reálné číslo v pythonu je zadána touto BNF gramatikou: floatnumber ::= pointfloat | exponentfloat pointfloat ::= [intpart] fraction | intpart "." exponentfloat ::= (intpart | pointfloat) exponent intpart ::= digit+ fraction ::= "." digit+ exponent ::= ("e" | "E") ["+" | "-"] digit+ digit ::= "0"..."9" * Vymyslete a naprogramujte stavový automat, který bude zjišťovat, zda je řetězec na řádce reálným číslem. * ==== Úloha 4 Obsahy závorek ==== * Uvažujme řetězec obsahující závorky () a []. * Napište program, který bude testovat, zda je výraz správně uzávorkován a zjistí text uvnitř závorek * Závorky mohou být do sebe vnořeny a pak text patří do poslední úrovně závorek * Program tedy text: aa[bb(cc)dd(ee)fff[gggg]]hhh * převede na výstup: ()cc ()ee []gggg []bbddfff * písmena 'aa' a 'hhh' se zahodí, nejsou uvnitř žádných závorek ===== domácí práce ===== ==== Lehká varianta:==== Proveďte lexikální analýzu jedné řádky vstupu, který může obsahovat pouze následující lexikální termy: * Dec: decimální číslo decimalinteger ::= nonzerodigit digit* | "0"+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" * Oct: octalové číslo (číslo v osmičkové soustavě) octinteger ::= "0" ("o" | "O") octdigit+ octdigit ::= "0"..."7" * Bin: binární číslo bininteger ::= "0" ("b" | "B") bindigit+ bindigit ::= "0" | "1" * Hex: hexadecimální číslo (číslo v šestnáctkové soustavě) digit ::= "0"..."9" hexinteger ::= "0" ("x" | "X") hexdigit+ hexdigit ::= digit | "a"..."f" | "A"..."F" * Rea: Reálné číslo - viz úloha 2 * Str: Pokud není vstup detekován v žádném předchozím případě * Komentáře neuvažujte, předpokládejte, že vstup obsahuje pouze písmena, číslice a znaky '+', '-'. * Program **number.py** načte jeden řádek standardního vstupu a vytiskne na výstup o jaký lexikální term * Program odevzdejte jako úlohu HW09. === Příklad === * Pokud je vstupní program následující kód: 1245 * pak je výstupem: Dec * Pokud je vstupní program následující kód: 0x12FF * pak je výstupem: Hex * Pokud je vstupní program následující kód: 0o123 * pak je výstupem: Oct * Pokud je vstupní program následující kód: 0B0101 * pak je výstupem: Bin * Pokud je vstupní program následující kód: 1e-25 * pak je výstupem: Rea * Pokud je vstupní program následující kód: 0o999 * pak je výstupem: Str ==== Těžší varianta:==== Proveďte lexikální analýzu Pythonovského programu, který může obsahovat pouze následující lexikální termy: * Str: Řetězec - začíná znaky ',",''',""" a může obsahovat sekvenci se znakem \. Pokud obsahuje řetězec sekvenci se znakem \X (X reprezentuje nějaký znak z množiny \,',",+,-), pak se do řetězce vloží pouze znak X. * Int: Celé číslo - integer: integer ::= decimalinteger | octinteger | hexinteger | bininteger decimalinteger ::= nonzerodigit digit* | "0"+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" octinteger ::= "0" ("o" | "O") octdigit+ hexinteger ::= "0" ("x" | "X") hexdigit+ bininteger ::= "0" ("b" | "B") bindigit+ octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F" bindigit ::= "0" | "1" * Rea: Reálné číslo - viz úloha 2 * Key: Klíčová slova Pythonu * Var:Proměnné - začíná písmenem a pak může obsahovat písmena, čísla a znak _ * Ope: Operátory: + - * ** / // % << >> & | ^ ~ < > <= >= == != * Sep: Oddělovače: ( ) [ ] { } , : . ; @ = -> += -= *= /= //= %= @= &= |= ^= >>= <<= **= Zadání úlohy * Předpokládejte, že je program syntakticky správně. * Komentáře neuvažujte, předpokládejte, že program je bez komentářů. * Progam **lexical.py** načte soubor zadaný jako vstupní parametr a vytiskne na výstup jednotlivé lexikální termy * Program odevzdejte jako úlohu HW09. === Příklad === * Pokud je zadaný vstupní soubor následující program: def funkce(a,b): c='' a**=b if a * pak je výstupem Vašeho programu: Key: def Var: funkce Sep: ( Var: a Sep: , Var: b Sep: ) Sep: : Var: c Sep: = Str: Var: a Sep: **= Var: b Key: if Var: a Ope: < Var: b Sep: : Var: print Sep: ( Str: ahoj'ky Sep: , Var: a Sep: ) Key: else Sep: : Var: print Sep: ( Int: 0xff Sep: , Int: 0b11101 Sep: , Int: 0o777 Sep: , Rea: .90e-10 Sep: , Rea: 123E+5 Sep: , Var: c Sep: ) Var: print Sep: ( Str: To je dlouhy retezec pres mnoho radku Sep: ) Var: funkce Sep: ( Ope: - Int: 256 Ope: + Int: 356 Sep: , Rea: .85 Ope: ** Rea: .33 Sep: )