Table of Contents

Cvičení 9, Fronta, Stavový automat

náplň cvičení

Quick test 1

Úloha 1 Fronta

Úloha 2 Komentáře - rozšíření

a='b\'c#d' #e
i="j\"k'l#m" #n

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

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+
digit         ::=  "0"..."9"

Úloha 4 Obsahy závorek

aa[bb(cc)dd(ee)fff[gggg]]hhh

()cc
()ee
[]gggg
[]bbddfff

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"

octinteger     ::=  "0" ("o" | "O") octdigit+
octdigit       ::=  "0"..."7"

bininteger     ::=  "0" ("b" | "B") bindigit+
bindigit       ::=  "0" | "1"

digit          ::=  "0"..."9"
hexinteger     ::=  "0" ("x" | "X") hexdigit+
hexdigit       ::=  digit | "a"..."f" | "A"..."F"

Příklad

1245

Dec

0x12FF

Hex

0o123

Oct

0B0101

Bin

1e-25

Rea

0o999

Str

Těžší varianta:

Proveďte lexikální analýzu Pythonovského programu, který může obsahovat pouze následující lexikální termy:

',",''',""" 
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.

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"

+       -       *       **      /       //      % 
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=

(       )       [       ]       {       }
,       :       .       ;       @       =       ->
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=

Zadání úlohy

Příklad

def funkce(a,b):
    c=''
    a**=b
    if a<b:
        print('ahoj\'ky',a)
    else:
        print(0xff,0b11101,0o777,.90e-10,123E+5,c)
        print('''To je dlouhy
        retezec pres mnoho
        radku''')
funkce(-256+356,.85**.33)

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: )