Otóż mam :
Zaprojektować składnię instrukcji switch, lecz użycie rekursji lewostronnej i produkcji wycierających obniża ocenę.
Oto legenda:

L = cyfra | L cyfra // liczba
Z = litera | Z litera | Z cyfra | Z '_' // zmienna

  • = '+' | '-' // operatory addytywne
  • = '*' | '/' // operatory multiplikatywne
    = '' // operator potęgowania
    @ = '@' // należenie do zbioru
    $ = '@@' // zawieranie zbiorów
    [ = '[' // zbiór - początek
    ] = ']' // zbiór - koniec
    , = ',' // oddzielenie w liście
    U = 'U' // suma zbiorów
    P = 'P' // przecięcie zbiorów
    R = '<' | '>' | '==' | '<>' | '>=' | '<=' // relacje
    ( = '(' // lewy nawias
    ) = ')' // prawy nawias
    & = '&&' // iloczyn logiczny
    | = '||' // suma logiczna
    ! = '!' // negacja logiczna
    I = 'if' // słowo kluczowe if
    E = 'else' // słowo kluczowe else
    F = 'for' // słowo kluczowe for
    W = 'while' // słowo kluczowe while
    D = 'do' // słowo kluczowe do
    S = 'switch' // słowo kluczowe switch
    C = 'case' // słowo kluczowe case
    B = 'break' // słowo kluczowe break
    T = 'default' // słowo kluczowe default
    { = '{' // lewy nawias instrukcyjny
    } = '}' // prawy nawias instrukcyjny
    ; = ';' // średnik
    : = ':' // dwukropek

Wstępnie zrobiłem to tak:
SWITCH = S( WYRAZENIE ) { WNETRZE }
WYRAZENIE = L
WYRAZENIE = Z
WYRAZENIE = ( WYRAZENIE )
WYRAZENIE = WYRAZENIE + WYRAZENIE
WYRAZENIE = WYRAZENIE * WYRAZENIE
WYRAZENIE = SWITCH
WYRAZENIE = WYRAZENIE - WYRAZENIE
WYRAZENIE = WYRAZENIE / WYRAZENIE
WYRAZENIE = WYRAZENIE ^ WYRAZENIE
WYRAZENIE = WYRAZENIE R WYRAZENIE
WYRAZENIE = WYRAZENIE && WYRAZENIE
WYRAZENIE = WYRAZENIE || WYRAZENIE
WNETRZE = C L : INSTRUKCJE ; DALEJ
WNETRZE = KIEDY : INSTRUKCJE ; DALEJ
INSTRUKCJE = WYRAZENIE
KIEDY = C L
KIEDY = T
DALEJ = B ;
DALEJ = ; WNETRZE

lecz to chyba jest zrobione rekurencją lewostronną i chyba nie wszystko dozwolone, jakby ktoś mi pomógł to poprawić to byłbym bardzo wdzięczny. Pozdrawiam.